perm filename MF.PSC[MF,DEK]8 blob
sn#770695 filedate 1984-09-28 generic text, type T, neo UTF8
{4:}{9:}{$C-,A+,D-,W+}{[$D:2]}{$C+,D:7,W+}{:9}PROGRAM MF;LABEL{6:}
1,9998,9999;{:6}CONST{11:}MEMMAX=60000;MAXINTERNAL=50;BUFSIZE=500;
ERRORLINE=72;HALFERRORLIN=42;MAXPRINTLINE=79;SCREENWIDTH=492;
SCREENDEPTH=456;STACKSIZE=30;MAXSTRINGS=1500;STRINGVACANC=8000;
POOLSIZE=32000;MOVESIZE=5000;GFBUFSIZE=800;FILENAMESIZE=23;
POOLNAME='MF.POOL[MF,SYS] ';PATHSIZE=100;
COUNTNAME='<TEX!>.TXT[TEX,SYS] ';CHECKPERIOD=10;WRITEPERIOD=12;
BISTACKSIZE=768;HEADERSIZE=100;LIGTABLESIZE=300;MAXFONTDIMEN=50;{:11}
TYPE{18:}ASCIICODE=0..127;{:18}{24:}EIGHTBITS=0..255;
ALPHAFILE=PACKED FILE OF CHAR;BYTEFILE=PACKED FILE OF EIGHTBITS;{:24}
{37:}POOLPOINTER=0..POOLSIZE;STRNUMBER=0..MAXSTRINGS;{:37}{98:}
SCALED=INTEGER;SMALLNUMBER=0..63;{:98}{102:}FRACTION=INTEGER;{:102}
{103:}ANGLE=INTEGER;{:103}{150:}QUARTERWORD=0..511;HALFWORD=0..262143;
TWOCHOICES=1..2;THREECHOICES=1..3;TWOHALVES=PACKED RECORD RH:HALFWORD;
CASE TWOCHOICES OF 1:(LH:HALFWORD);2:(B0:QUARTERWORD;B1:QUARTERWORD);
END;FOURQUARTERS=PACKED RECORD B0:QUARTERWORD;B1:QUARTERWORD;
B2:QUARTERWORD;B3:QUARTERWORD;END;
MEMORYWORD=RECORD CASE THREECHOICES OF 1:(INT:INTEGER);2:(HH:TWOHALVES);
3:(QQQQ:FOURQUARTERS);END;WORDFILE=FILE OF MEMORYWORD;{:150}{181:}
COMMANDCODE=1..81;{:181}{524:}SCREENROW=0..SCREENDEPTH;
SCREENCOL=0..SCREENWIDTH;TRANSSPEC=ARRAY[SCREENCOL]OF SCREENCOL;
PIXELCOLOR=0..1;{:524}{530:}WINDOWNUMBER=0..15;{:530}{584:}
INSTATERECOR=RECORD INDEXFIELD:QUARTERWORD;
STARTFIELD,LOCFIELD,LIMITFIELD,NAMEFIELD:HALFWORD;END;{:584}{1098:}
GFINDEX=0..GFBUFSIZE;PACKEDBYTES=PACKED ARRAY[GFINDEX]OF EIGHTBITS;
{:1098}VAR{13:}BAD:INTEGER;{:13}{20:}XORD:ARRAY[CHAR]OF ASCIICODE;
XCHR:ARRAY[ASCIICODE]OF CHAR;{:20}{25:}
NAMEOFFILE:PACKED ARRAY[1..FILENAMESIZE]OF CHAR;
NAMELENGTH:0..FILENAMESIZE;{:25}{29:}
BUFFER:ARRAY[0..BUFSIZE]OF ASCIICODE;FIRST:0..BUFSIZE;LAST:0..BUFSIZE;
MAXBUFSTACK:0..BUFSIZE;AUXBUF:ARRAY[0..70]OF CHAR;{:29}{38:}
STRPOOL:PACKED ARRAY[POOLPOINTER]OF ASCIICODE;
STRSTART:ARRAY[STRNUMBER]OF POOLPOINTER;POOLPTR:POOLPOINTER;
STRPTR:STRNUMBER;INITPOOLPTR:POOLPOINTER;INITSTRPTR:STRNUMBER;
MAXPOOLPTR:POOLPOINTER;MAXSTRPTR:STRNUMBER;{:38}{42:}
STRREF:ARRAY[STRNUMBER]OF 0..127;{:42}{50:}POOLFILE:ALPHAFILE;{:50}{54:}
LOGFILE:ALPHAFILE;SELECTOR:0..5;DIG:ARRAY[0..22]OF 0..15;TALLY:INTEGER;
TERMOFFSET:0..MAXPRINTLINE;FILEOFFSET:0..MAXPRINTLINE;
TRICKBUF:ARRAY[0..ERRORLINE]OF ASCIICODE;TRICKCOUNT:INTEGER;
FIRSTCOUNT:INTEGER;{:54}{67:}INTERACTION:0..3;{:67}{70:}
DELETIONSALL:BOOLEAN;HISTORY:0..3;ERRORCOUNT:-1..100;{:70}{73:}
HELPLINE:ARRAY[0..5]OF STRNUMBER;HELPPTR:0..6;USEERRHELP:BOOLEAN;
ERRHELP:STRNUMBER;{:73}{89:}INTERRUPT:INTEGER;OKTOINTERRUP:BOOLEAN;{:89}
{95:}ARITHERROR:BOOLEAN;{:95}{123:}TWOTOTHE:ARRAY[0..30]OF INTEGER;
SPECLOG:ARRAY[1..28]OF INTEGER;{:123}{131:}
SPECATAN:ARRAY[1..26]OF ANGLE;{:131}{138:}NSIN,NCOS:FRACTION;{:138}
{142:}RANDOMS:ARRAY[0..54]OF FRACTION;JRANDOM:0..54;{:142}{152:}
TEMPPTR:HALFWORD;{:152}{153:}MEM:ARRAY[0..MEMMAX]OF MEMORYWORD;{:153}
{154:}VARUSED,DYNUSED:INTEGER;MAXVARUSED:INTEGER;{:154}{155:}
AVAIL:HALFWORD;MEMEND:HALFWORD;{:155}{160:}ROVER:HALFWORD;{:160}{173:}
FREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;
WASFREE:PACKED ARRAY[0..MEMMAX]OF BOOLEAN;WASMEMEND:HALFWORD;
PANICKING:BOOLEAN;{:173}{184:}INTERNAL:ARRAY[1..MAXINTERNAL]OF SCALED;
INTNAME:ARRAY[1..MAXINTERNAL]OF STRNUMBER;INTPTR:31..MAXINTERNAL;{:184}
{190:}OLDSETTING:0..5;{:190}{192:}
CHARCLASS:ARRAY[ASCIICODE]OF ASCIICODE;{:192}{194:}HASHUSED:HALFWORD;
STCOUNT:INTEGER;{:194}{195:}HASH:ARRAY[1..2243]OF TWOHALVES;
EQTB:ARRAY[1..2243]OF TWOHALVES;{:195}{222:}
BIGNODESIZE:ARRAY[13..14]OF SMALLNUMBER;{:222}{242:}SAVEPTR:HALFWORD;
{:242}{259:}PATHTAIL:HALFWORD;{:259}{271:}
DELTAX,DELTAY,DELTA:ARRAY[0..PATHSIZE]OF SCALED;
PSI:ARRAY[1..PATHSIZE]OF ANGLE;{:271}{275:}
THETA:ARRAY[0..PATHSIZE]OF ANGLE;UU:ARRAY[0..PATHSIZE]OF FRACTION;
VV:ARRAY[0..PATHSIZE]OF ANGLE;WW:ARRAY[0..PATHSIZE]OF FRACTION;{:275}
{290:}ST,CT,SF,CF:FRACTION;{:290}{300:}
MOVE:ARRAY[0..MOVESIZE]OF INTEGER;MOVEPTR:0..MOVESIZE;{:300}{301:}
BISECTSTACK:ARRAY[0..BISTACKSIZE]OF INTEGER;BISECTPTR:0..BISTACKSIZE;
{:301}{319:}CUREDGES:HALFWORD;CURWT:INTEGER;{:319}{358:}TRACEX:INTEGER;
TRACEY:INTEGER;TRACEYY:INTEGER;{:358}{375:}CURX,CURY:SCALED;{:375}{383:}
WINDINGNUMBE:INTEGER;{:383}{403:}OCTANTNUMBER:ARRAY[1..8]OF 1..8;
OCTANTCODE:ARRAY[1..8]OF 1..8;{:403}{415:}
XCORR,YCORR:ARRAY[1..8]OF 0..1;XYCORR:ARRAY[1..8]OF 0..1;{:415}{422:}
CURM,CURN,CURD,CURDD:INTEGER;OCTANT:1..8;
GOOD1,GOOD2,GOOD3:ARRAY[1..8]OF INTEGER;{:422}{425:}M0,N0,M1,N1:INTEGER;
X0,Y0,X1,Y1:SCALED;D0,DD0,D1:0..1;{:425}{469:}
ENVMOVE:ARRAY[0..MOVESIZE]OF INTEGER;{:469}{514:}CURT,CURTT:INTEGER;
{:514}{516:}DELX,DELY:INTEGER;UV,XY:0..BISTACKSIZE;{:516}{525:}
{SCREENPIXEL:ARRAY[SCREENROW,SCREENCOL]OF PIXELCOLOR;}{:525}{528:}
SCREENSTARTE:BOOLEAN;SCREENOK:BOOLEAN;{:528}{531:}
WINDOWOPEN:ARRAY[WINDOWNUMBER]OF BOOLEAN;
LEFTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
RIGHTCOL:ARRAY[WINDOWNUMBER]OF SCREENCOL;
TOPROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
BOTROW:ARRAY[WINDOWNUMBER]OF SCREENROW;
MWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
NWINDOW:ARRAY[WINDOWNUMBER]OF INTEGER;
WINDOWTIME:ARRAY[WINDOWNUMBER]OF INTEGER;{:531}{538:}
ROWTRANSITIO:TRANSSPEC;{:538}{550:}FIXNEEDED:BOOLEAN;WATCHCOEFS:BOOLEAN;
DEPFINAL:HALFWORD;{:550}{581:}CURCMD:EIGHTBITS;CURMOD:INTEGER;
CURSYM:HALFWORD;{:581}{585:}
INPUTSTACK:ARRAY[0..STACKSIZE]OF INSTATERECOR;INPUTPTR:0..STACKSIZE;
MAXINSTACK:0..STACKSIZE;CURINPUT:INSTATERECOR;{:585}{588:}INOPEN:0..6;
INPUTFILE:ARRAY[1..6]OF ALPHAFILE;LINE:INTEGER;
LINESTACK:ARRAY[1..6]OF INTEGER;PAGE:INTEGER;
PAGESTACK:ARRAY[1..6]OF INTEGER;{:588}{590:}
PARAMSTACK:ARRAY[0..150]OF HALFWORD;PARAMPTR:0..150;
MAXPARAMSTAC:INTEGER;{:590}{591:}FILEPTR:0..STACKSIZE;{:591}{615:}
SCANNERSTATU:0..6;WARNINGINFO:INTEGER;{:615}{635:}FORCEEOF:BOOLEAN;
{:635}{692:}CONDPTR:HALFWORD;IFLIMIT:0..4;CURIF:SMALLNUMBER;
IFLINE:INTEGER;{:692}{706:}LOOPPTR:HALFWORD;{:706}{720:}
CURNAME:STRNUMBER;CURAREA:STRNUMBER;CUREXT:STRNUMBER;{:720}{721:}
AREADELIMITE:POOLPOINTER;EXTDELIMITER:POOLPOINTER;{:721}{728:}
MFBASEDEFAUL:PACKED ARRAY[1..18]OF CHAR;{:728}{735:}JOBNAME:STRNUMBER;
LOGNAME:STRNUMBER;{:735}{743:}GFFILE:BYTEFILE;OUTPUTFILENA:STRNUMBER;
{:743}{748:}CURTYPE:SMALLNUMBER;CUREXP:INTEGER;{:748}{765:}
MAXC:ARRAY[16..17]OF INTEGER;MAXPTR:ARRAY[16..17]OF HALFWORD;
MAXLINK:ARRAY[16..17]OF HALFWORD;{:765}{773:}VARFLAG:0..81;{:773}{907:}
TXX,TXY,TYX,TYY,TX,TY:SCALED;{:907}{1025:}STARTSYM:HALFWORD;{:1025}
{1032:}LONGHELPSEEN:BOOLEAN;{:1032}{1035:}TFMFILE:BYTEFILE;
METRICFILENA:STRNUMBER;{:1035}{1044:}BC,EC:EIGHTBITS;
TFMWIDTH:ARRAY[EIGHTBITS]OF SCALED;TFMHEIGHT:ARRAY[EIGHTBITS]OF SCALED;
TFMDEPTH:ARRAY[EIGHTBITS]OF SCALED;
TFMITALCORR:ARRAY[EIGHTBITS]OF SCALED;
CHAREXISTS:ARRAY[EIGHTBITS]OF BOOLEAN;CHARTAG:ARRAY[EIGHTBITS]OF 0..3;
CHARREMAINDE:ARRAY[EIGHTBITS]OF EIGHTBITS;
HEADERBYTE:ARRAY[1..HEADERSIZE]OF-1..255;
LIGKERN:ARRAY[0..LIGTABLESIZE]OF FOURQUARTERS;NL:0..LIGTABLESIZE;
KERN:ARRAY[EIGHTBITS]OF SCALED;NK:0..256;
EXTEN:ARRAY[EIGHTBITS]OF FOURQUARTERS;NE:0..256;
PARAM:ARRAY[1..MAXFONTDIMEN]OF SCALED;NP:0..MAXFONTDIMEN;
NW,NH,ND,NI:0..256;{:1044}{1067:}PERTURBATION:SCALED;{:1067}{1073:}
DIMENHEAD:ARRAY[1..4]OF HALFWORD;{:1073}{1084:}MAXTFMDIMEN:SCALED;
TFMCHANGED:INTEGER;{:1084}{1096:}GFMINX,GFMAXX,GFMINY,GFMAXY:INTEGER;
GFPREVPTR:INTEGER;TOTALCHARS:INTEGER;CHARPTR:ARRAY[EIGHTBITS]OF INTEGER;
GFWIDTH:ARRAY[EIGHTBITS]OF INTEGER;{:1096}{1099:}GFBUF:PACKEDBYTES;
HALFBUF:GFINDEX;GFLIMIT:GFINDEX;GFPTR:GFINDEX;GFOFFSET:INTEGER;{:1099}
{1126:}BASEIDENT:STRNUMBER;{:1126}{1131:}BASEFILE:WORDFILE;{:1131}
{1146:}READYALREADY:INTEGER;{:1146}{1157:}PSEUDOTYPEIN:STRNUMBER;{:1157}
{1160:}{COUNTFILE:ALPHAFILE;}{:1160}{1168:}
ESCBREAK:ARRAY[1..1]OF INTEGER;{:1168}PROCEDURE INITIALIZE;VAR{19:}
I:0..127;{:19}{124:}K:INTEGER;{:124}BEGIN{21:}XCHR[32]:=' ';
XCHR[33]:='!';XCHR[34]:='"';XCHR[35]:='#';XCHR[36]:='$';XCHR[37]:='%';
XCHR[38]:='&';XCHR[39]:='''';XCHR[40]:='(';XCHR[41]:=')';XCHR[42]:='*';
XCHR[43]:='+';XCHR[44]:=',';XCHR[45]:='-';XCHR[46]:='.';XCHR[47]:='/';
XCHR[48]:='0';XCHR[49]:='1';XCHR[50]:='2';XCHR[51]:='3';XCHR[52]:='4';
XCHR[53]:='5';XCHR[54]:='6';XCHR[55]:='7';XCHR[56]:='8';XCHR[57]:='9';
XCHR[58]:=':';XCHR[59]:=';';XCHR[60]:='<';XCHR[61]:='=';XCHR[62]:='>';
XCHR[63]:='?';XCHR[64]:='@';XCHR[65]:='A';XCHR[66]:='B';XCHR[67]:='C';
XCHR[68]:='D';XCHR[69]:='E';XCHR[70]:='F';XCHR[71]:='G';XCHR[72]:='H';
XCHR[73]:='I';XCHR[74]:='J';XCHR[75]:='K';XCHR[76]:='L';XCHR[77]:='M';
XCHR[78]:='N';XCHR[79]:='O';XCHR[80]:='P';XCHR[81]:='Q';XCHR[82]:='R';
XCHR[83]:='S';XCHR[84]:='T';XCHR[85]:='U';XCHR[86]:='V';XCHR[87]:='W';
XCHR[88]:='X';XCHR[89]:='Y';XCHR[90]:='Z';XCHR[91]:='[';XCHR[92]:='\';
XCHR[93]:=']';XCHR[94]:='↑';XCHR[95]:='_';XCHR[96]:='`';XCHR[97]:='a';
XCHR[98]:='b';XCHR[99]:='c';XCHR[100]:='d';XCHR[101]:='e';
XCHR[102]:='f';XCHR[103]:='g';XCHR[104]:='h';XCHR[105]:='i';
XCHR[106]:='j';XCHR[107]:='k';XCHR[108]:='l';XCHR[109]:='m';
XCHR[110]:='n';XCHR[111]:='o';XCHR[112]:='p';XCHR[113]:='q';
XCHR[114]:='r';XCHR[115]:='s';XCHR[116]:='t';XCHR[117]:='u';
XCHR[118]:='v';XCHR[119]:='w';XCHR[120]:='x';XCHR[121]:='y';
XCHR[122]:='z';XCHR[123]:='{';XCHR[124]:='|';XCHR[125]:='}';
XCHR[126]:='~';XCHR[0]:=' ';XCHR[127]:=' ';{:21}{22:}
FOR I:=1 TO 31 DO XCHR[I]:=CHR(I);XCHR[24]:=CHR(95);XCHR[26]:=CHR(27);
XCHR[27]:=CHR(126);{:22}{23:}FOR I:=0 TO 127 DO XORD[CHR(I)]:=127;
FOR I:=1 TO 126 DO XORD[XCHR[I]]:=I;XORD[CHR(9)]:=32;{:23}{68:}
INTERACTION:=3;{:68}{71:}DELETIONSALL:=TRUE;ERRORCOUNT:=0;{:71}{74:}
HELPPTR:=0;USEERRHELP:=FALSE;ERRHELP:=0;{:74}{90:}INTERRUPT:=0;
OKTOINTERRUP:=TRUE;{:90}{96:}ARITHERROR:=FALSE;{:96}{125:}
TWOTOTHE[0]:=1;FOR K:=1 TO 30 DO TWOTOTHE[K]:=2*TWOTOTHE[K-1];
SPECLOG[1]:=93032640;SPECLOG[2]:=38612034;SPECLOG[3]:=17922280;
SPECLOG[4]:=8662214;SPECLOG[5]:=4261238;SPECLOG[6]:=2113709;
SPECLOG[7]:=1052693;SPECLOG[8]:=525315;SPECLOG[9]:=262400;
SPECLOG[10]:=131136;SPECLOG[11]:=65552;SPECLOG[12]:=32772;
SPECLOG[13]:=16385;FOR K:=14 TO 27 DO SPECLOG[K]:=TWOTOTHE[27-K];
SPECLOG[28]:=1;{:125}{132:}SPECATAN[1]:=27855475;SPECATAN[2]:=14718068;
SPECATAN[3]:=7471121;SPECATAN[4]:=3750058;SPECATAN[5]:=1876857;
SPECATAN[6]:=938658;SPECATAN[7]:=469357;SPECATAN[8]:=234682;
SPECATAN[9]:=117342;SPECATAN[10]:=58671;SPECATAN[11]:=29335;
SPECATAN[12]:=14668;SPECATAN[13]:=7334;SPECATAN[14]:=3667;
SPECATAN[15]:=1833;SPECATAN[16]:=917;SPECATAN[17]:=458;
SPECATAN[18]:=229;SPECATAN[19]:=115;SPECATAN[20]:=57;SPECATAN[21]:=29;
SPECATAN[22]:=14;SPECATAN[23]:=7;SPECATAN[24]:=4;SPECATAN[25]:=2;
SPECATAN[26]:=1;{:132}{174:}WASMEMEND:=0;PANICKING:=FALSE;{:174}{185:}
FOR K:=1 TO 31 DO INTERNAL[K]:=0;INTPTR:=31;{:185}{193:}
FOR K:=48 TO 57 DO CHARCLASS[K]:=0;CHARCLASS[46]:=1;
FOR K:=0 TO 32 DO CHARCLASS[K]:=2;CHARCLASS[24]:=10;CHARCLASS[26]:=10;
CHARCLASS[28]:=10;CHARCLASS[29]:=10;CHARCLASS[12]:=20;CHARCLASS[127]:=2;
CHARCLASS[37]:=3;CHARCLASS[34]:=4;CHARCLASS[44]:=5;CHARCLASS[59]:=6;
CHARCLASS[40]:=7;CHARCLASS[41]:=8;FOR K:=65 TO 90 DO CHARCLASS[K]:=9;
FOR K:=97 TO 122 DO CHARCLASS[K]:=9;CHARCLASS[95]:=9;CHARCLASS[60]:=10;
CHARCLASS[61]:=10;CHARCLASS[62]:=10;CHARCLASS[58]:=10;
CHARCLASS[124]:=10;CHARCLASS[96]:=11;CHARCLASS[39]:=11;
CHARCLASS[43]:=12;CHARCLASS[45]:=12;CHARCLASS[47]:=13;CHARCLASS[42]:=13;
CHARCLASS[92]:=13;CHARCLASS[33]:=14;CHARCLASS[63]:=14;CHARCLASS[35]:=15;
CHARCLASS[38]:=15;CHARCLASS[64]:=15;CHARCLASS[36]:=15;CHARCLASS[94]:=16;
CHARCLASS[126]:=16;CHARCLASS[91]:=17;CHARCLASS[93]:=18;
CHARCLASS[123]:=19;CHARCLASS[125]:=19;{:193}{196:}HASH[1].LH:=0;
HASH[1].RH:=0;EQTB[1].LH:=39;EQTB[1].RH:=0;
FOR K:=2 TO 2243 DO BEGIN HASH[K]:=HASH[1];EQTB[K]:=EQTB[1];END;{:196}
{223:}BIGNODESIZE[13]:=12;BIGNODESIZE[14]:=4;{:223}{243:}SAVEPTR:=0;
{:243}{404:}OCTANTCODE[1]:=1;OCTANTCODE[2]:=5;OCTANTCODE[3]:=6;
OCTANTCODE[4]:=2;OCTANTCODE[5]:=4;OCTANTCODE[6]:=8;OCTANTCODE[7]:=7;
OCTANTCODE[8]:=3;FOR K:=1 TO 8 DO OCTANTNUMBER[OCTANTCODE[K]]:=K;{:404}
{416:}XCORR[1]:=0;YCORR[1]:=0;XYCORR[1]:=0;XCORR[5]:=0;YCORR[5]:=0;
XYCORR[5]:=1;XCORR[6]:=0;YCORR[6]:=1;XYCORR[6]:=0;XCORR[2]:=1;
YCORR[2]:=0;XYCORR[2]:=1;XCORR[4]:=1;YCORR[4]:=1;XYCORR[4]:=1;
XCORR[8]:=1;YCORR[8]:=1;XYCORR[8]:=0;XCORR[7]:=1;YCORR[7]:=0;
XYCORR[7]:=1;XCORR[3]:=0;YCORR[3]:=1;XYCORR[3]:=0;{:416}{423:}
FOR K:=1 TO 8 DO BEGIN GOOD1[K]:=XYCORR[K]-XCORR[K]+YCORR[K];
GOOD2[K]:=32768-YCORR[K]+GOOD1[K];
IF ODD(K)THEN GOOD3[K]:=1 ELSE GOOD3[K]:=2;END;{:423}{529:}
SCREENSTARTE:=FALSE;SCREENOK:=FALSE;{:529}{532:}
FOR K:=0 TO 15 DO BEGIN WINDOWOPEN[K]:=FALSE;WINDOWTIME[K]:=0;END;{:532}
{551:}FIXNEEDED:=FALSE;WATCHCOEFS:=TRUE;{:551}{693:}CONDPTR:=0;
IFLIMIT:=0;CURIF:=0;IFLINE:=0;{:693}{729:}
MFBASEDEFAUL:='PLAIN.bas[tex,sys]';{:729}{749:}CUREXP:=0;{:749}{774:}
VARFLAG:=0;{:774}{1026:}STARTSYM:=0;{:1026}{1033:}LONGHELPSEEN:=FALSE;
{:1033}{1045:}FOR K:=0 TO 255 DO BEGIN TFMWIDTH[K]:=0;TFMHEIGHT[K]:=0;
TFMDEPTH[K]:=0;TFMITALCORR[K]:=0;CHAREXISTS[K]:=FALSE;CHARTAG[K]:=0;
CHARREMAINDE[K]:=0;END;FOR K:=1 TO HEADERSIZE DO HEADERBYTE[K]:=-1;
BC:=255;EC:=0;NL:=0;NK:=0;NE:=0;NP:=0;{:1045}{1097:}GFPREVPTR:=0;
TOTALCHARS:=0;{:1097}{1100:}HALFBUF:=GFBUFSIZE DIV 2;GFLIMIT:=GFBUFSIZE;
GFPTR:=0;GFOFFSET:=0;{:1100}{1127:}BASEIDENT:=0;{:1127}{1158:}
PSEUDOTYPEIN:=0;PAGE:=0;{:1158}END;{57:}PROCEDURE PRINTLN;
BEGIN CASE SELECTOR OF 3:BEGIN WRITELN(TTY);WRITELN(LOGFILE);
TERMOFFSET:=0;FILEOFFSET:=0;END;2:BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;1:BEGIN WRITELN(TTY);TERMOFFSET:=0;END;0,4,5:;END;END;{:57}{58:}
PROCEDURE PRINTCHAR(S:ASCIICODE);
BEGIN CASE SELECTOR OF 3:BEGIN WRITE(TTY,XCHR[S]);
WRITE(LOGFILE,XCHR[S]);TERMOFFSET:=TERMOFFSET+1;
FILEOFFSET:=FILEOFFSET+1;
IF TERMOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(TTY);TERMOFFSET:=0;END;
IF FILEOFFSET=MAXPRINTLINE THEN BEGIN WRITELN(LOGFILE);FILEOFFSET:=0;
END;END;2:BEGIN WRITE(LOGFILE,XCHR[S]);FILEOFFSET:=FILEOFFSET+1;
IF FILEOFFSET=MAXPRINTLINE THEN PRINTLN;END;1:BEGIN WRITE(TTY,XCHR[S]);
TERMOFFSET:=TERMOFFSET+1;IF TERMOFFSET=MAXPRINTLINE THEN PRINTLN;END;0:;
4:IF TALLY<TRICKCOUNT THEN TRICKBUF[TALLY MOD ERRORLINE]:=S;
5:BEGIN IF POOLPTR<POOLSIZE THEN BEGIN STRPOOL[POOLPTR]:=S;
POOLPTR:=POOLPTR+1;END;END;END;TALLY:=TALLY+1;END;{:58}{59:}
PROCEDURE PRINT(S:INTEGER);VAR J:POOLPOINTER;
BEGIN IF(S<0)OR(S>=STRPTR)THEN S:=131;J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN PRINTCHAR(STRPOOL[J]);J:=J+1;END;END;{:59}
{61:}PROCEDURE PRINTNL(S:STRNUMBER);
BEGIN IF((TERMOFFSET>0)AND(ODD(SELECTOR)))OR((FILEOFFSET>0)AND(SELECTOR
>=2))THEN PRINTLN;PRINT(S);END;{:61}{62:}
PROCEDURE PRINTTHEDIGS(K:EIGHTBITS);BEGIN WHILE K>0 DO BEGIN K:=K-1;
PRINTCHAR(48+DIG[K]);END;END;{:62}{63:}PROCEDURE PRINTINT(N:INTEGER);
VAR K:0..23;M:INTEGER;BEGIN K:=0;IF N<0 THEN BEGIN PRINTCHAR(45);
IF N>-100000000 THEN N:=-N ELSE BEGIN M:=-1-N;N:=M DIV 10;
M:=(M MOD 10)+1;K:=1;IF M<10 THEN DIG[0]:=M ELSE BEGIN DIG[0]:=0;N:=N+1;
END;END;END;REPEAT DIG[K]:=N MOD 10;N:=N DIV 10;K:=K+1;UNTIL N=0;
PRINTTHEDIGS(K);END;{:63}{100:}PROCEDURE PRINTSCALED(S:SCALED);
VAR DELTA:SCALED;BEGIN IF S<0 THEN BEGIN PRINTCHAR(45);S:=-S;END;
PRINTINT(S DIV 65536);S:=10*(S MOD 65536)+5;
IF S<>5 THEN BEGIN DELTA:=10;PRINTCHAR(46);
REPEAT IF DELTA>65536 THEN S:=S+32768-(DELTA DIV 2);
PRINTCHAR(48+(S DIV 65536));S:=10*(S MOD 65536);DELTA:=DELTA*10;
UNTIL S<=DELTA;END;END;{:100}{101:}PROCEDURE PRINTTWO(X,Y:SCALED);
BEGIN PRINTCHAR(40);PRINTSCALED(X);PRINTCHAR(44);PRINTSCALED(Y);
PRINTCHAR(41);END;{:101}{182:}PROCEDURE PRINTTYPE(T:SMALLNUMBER);
BEGIN CASE T OF 1:PRINT(197);2:PRINT(198);3:PRINT(199);4:PRINT(200);
5:PRINT(201);6:PRINT(202);7:PRINT(203);8:PRINT(204);9:PRINT(205);
10:PRINT(206);11:PRINT(207);12:PRINT(208);13:PRINT(209);14:PRINT(210);
15:PRINT(211);16:PRINT(212);17:PRINT(213);18:PRINT(214);19:PRINT(215);
20:PRINT(216);21:PRINT(217);22:PRINT(218);23:PRINT(219);
OTHERS:PRINT(220)END;END;{:182}{189:}PROCEDURE BEGINDIAGNOS;
BEGIN OLDSETTING:=SELECTOR;IF HISTORY=0 THEN HISTORY:=1;
IF(INTERNAL[11]<=0)AND(SELECTOR=3)THEN SELECTOR:=SELECTOR-1;END;
PROCEDURE ENDDIAGNOSTI(BLANKLINE:BOOLEAN);BEGIN PRINTNL(312);
IF BLANKLINE THEN PRINTLN;SELECTOR:=OLDSETTING;END;{:189}{191:}
PROCEDURE PRINTDIAGNOS(S,T:STRNUMBER);BEGIN BEGINDIAGNOS;PRINTNL(S);
PRINT(313);PRINTINT(LINE);PRINT(T);PRINTCHAR(58);END;{:191}{726:}
PROCEDURE PRINTFILENAM(N,A,E:INTEGER);BEGIN PRINT(N);PRINT(E);PRINT(A);
END;{:726}{33:}FUNCTION INSKP0:BOOLEAN;EXTERN;PROCEDURE WAKEUPTERMIN;
VAR VAL:INTEGER;SUCCESS:BOOLEAN;BEGIN BEGIN IF INSKP0 THEN END;
ESCBREAK[1]:=536870912+ORD('N');CALLI(131153,-1,ESCBREAK,VAL,SUCCESS);
END;{:33}{72:}PROCEDURE NORMALIZESEL;FORWARD;PROCEDURE GETNEXT;FORWARD;
PROCEDURE TERMINPUT;FORWARD;PROCEDURE SHOWCONTEXT;FORWARD;
PROCEDURE BEGINFILEREA;FORWARD;PROCEDURE OPENLOGFILE;FORWARD;
PROCEDURE CLOSEFILESAN;FORWARD;PROCEDURE CLEARFORERRO;FORWARD;
PROCEDURE DEBUGHELP;FORWARD;{43:}PROCEDURE FLUSHSTRING(S:STRNUMBER);
BEGIN IF S<STRPTR-1 THEN STRREF[S]:=0 ELSE REPEAT STRPTR:=STRPTR-1;
UNTIL STRREF[STRPTR-1]<>0;POOLPTR:=STRSTART[STRPTR];END;{:43}{:72}{75:}
PROCEDURE JUMPOUT;BEGIN GOTO 9998;END;{:75}{76:}PROCEDURE ERROR;
LABEL 22,10;VAR C:ASCIICODE;S1,S2,S3:INTEGER;
BEGIN IF HISTORY<2 THEN HISTORY:=2;PRINTCHAR(46);SHOWCONTEXT;
IF INTERACTION=3 THEN{77:}WHILE TRUE DO BEGIN 22:CLEARFORERRO;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(135);TERMINPUT;END;
IF LAST=FIRST THEN GOTO 10;C:=BUFFER[FIRST];IF C>=97 THEN C:=C-32;{78:}
CASE C OF 49,50,51,52,53,54,55,56,57:IF DELETIONSALL THEN{82:}
BEGIN S1:=CURCMD;S2:=CURMOD;S3:=CURSYM;OKTOINTERRUP:=FALSE;
IF(LAST>FIRST+1)AND(BUFFER[FIRST+1]>=48)AND(BUFFER[FIRST+1]<=57)THEN C:=
C*10+BUFFER[FIRST+1]-48*11 ELSE C:=C-48;WHILE C>0 DO BEGIN GETNEXT;
{697:}
IF CURCMD=41 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:697}
;C:=C-1;END;CURCMD:=S1;CURMOD:=S2;CURSYM:=S3;OKTOINTERRUP:=TRUE;
BEGIN HELPPTR:=2;HELPLINE[1]:=150;HELPLINE[0]:=151;END;SHOWCONTEXT;
GOTO 22;END{:82};68:BEGIN DEBUGHELP;GOTO 22;END;
69,84:IF FILEPTR>0 THEN BEGIN SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];
PRINT(136);PRINT(INPUTSTACK[FILEPTR].NAMEFIELD);PRINTCHAR(47);
PRINTINT(PAGE);PRINT(137);PRINTINT(LINE);PRINTCHAR(108);PRINTCHAR(13);
IF STRPTR<MAXSTRINGS THEN BEGIN PSEUDOTYPEIN:=STRPTR;STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=POOLPTR;END;SELECTOR:=3;INTERACTION:=2;JUMPOUT;END;
72:{83:}BEGIN IF USEERRHELP THEN BEGIN PRINT(ERRHELP);USEERRHELP:=FALSE;
END ELSE BEGIN IF HELPPTR=0 THEN BEGIN HELPPTR:=2;HELPLINE[1]:=152;
HELPLINE[0]:=153;END;REPEAT HELPPTR:=HELPPTR-1;PRINT(HELPLINE[HELPPTR]);
PRINTLN;UNTIL HELPPTR=0;END;BEGIN HELPPTR:=4;HELPLINE[3]:=154;
HELPLINE[2]:=153;HELPLINE[1]:=155;HELPLINE[0]:=156;END;GOTO 22;END{:83};
73:{81:}BEGIN BEGINFILEREA;
IF LAST>FIRST+1 THEN BEGIN CURINPUT.LOCFIELD:=FIRST+1;BUFFER[FIRST]:=32;
END ELSE BEGIN BEGIN BEGIN IF INSKP0 THEN END;PRINT(149);TERMINPUT;END;
CURINPUT.LOCFIELD:=FIRST;END;FIRST:=LAST+1;CURINPUT.LIMITFIELD:=LAST;
GOTO 10;END{:81};81,82,83:{80:}BEGIN ERRORCOUNT:=0;INTERACTION:=0+C-81;
PRINT(144);CASE C OF 81:BEGIN PRINT(145);SELECTOR:=SELECTOR-1;END;
82:PRINT(146);83:PRINT(147);END;PRINT(148);PRINTLN;BREAK(TTY);GOTO 10;
END{:80};88:BEGIN INTERACTION:=2;JUMPOUT;END;OTHERS:END;{79:}
BEGIN PRINT(138);PRINTNL(139);PRINTNL(140);IF FILEPTR>0 THEN PRINT(141);
IF DELETIONSALL THEN PRINTNL(142);PRINTNL(143);END{:79}{:78};END{:77};
ERRORCOUNT:=ERRORCOUNT+1;IF ERRORCOUNT=100 THEN BEGIN PRINTNL(134);
HISTORY:=3;JUMPOUT;END;{84:}IF INTERACTION>0 THEN SELECTOR:=SELECTOR-1;
IF USEERRHELP THEN PRINTNL(ERRHELP)ELSE WHILE HELPPTR>0 DO BEGIN HELPPTR
:=HELPPTR-1;PRINTNL(HELPLINE[HELPPTR]);END;PRINTLN;
IF INTERACTION>0 THEN SELECTOR:=SELECTOR+1;PRINTLN{:84};10:END;{:76}
{86:}PROCEDURE FATALERROR(S:STRNUMBER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(157);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=S;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:86}{87:}
PROCEDURE OVERFLOW(S:STRNUMBER;N:INTEGER);BEGIN NORMALIZESEL;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(158);END;
PRINT(S);PRINTCHAR(61);PRINTINT(N);PRINTCHAR(93);BEGIN HELPPTR:=2;
HELPLINE[1]:=159;HELPLINE[0]:=160;END;
BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:87}{88:}
PROCEDURE CONFUSION(S:STRNUMBER);BEGIN NORMALIZESEL;
IF HISTORY<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(161);END;PRINT(S);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=162;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(163);END;BEGIN HELPPTR:=2;HELPLINE[1]:=164;HELPLINE[0]:=165;END;
END;BEGIN IF INTERACTION=3 THEN INTERACTION:=2;ERROR;
IF INTERACTION>0 THEN DEBUGHELP;HISTORY:=3;JUMPOUT;END;END;{:88}{:4}
{26:}FUNCTION ERSTAT(VAR F:FILE):INTEGER;EXTERN;
FUNCTION AOPENIN(VAR F:ALPHAFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/E/O/N:9');AOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION AOPENOUT(VAR F:ALPHAFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:2');AOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION BOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');BOPENOUT:=ERSTAT(F)MOD 8192=0;END;
FUNCTION TFMBOPENOUT(VAR F:BYTEFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/B:8/O');TFMBOPENOUT:=ERSTAT(F)MOD 8192=0;
END;FUNCTION WOPENIN(VAR F:WORDFILE):BOOLEAN;
BEGIN RESET(F,NAMEOFFILE,'/O/N:9');WOPENIN:=ERSTAT(F)MOD 8192=0;END;
FUNCTION WOPENOUT(VAR F:WORDFILE):BOOLEAN;
BEGIN REWRITE(F,NAMEOFFILE,'/O/N:9');WOPENOUT:=ERSTAT(F)MOD 8192=0;END;
{:26}{27:}PROCEDURE ACLOSE(VAR F:ALPHAFILE);BEGIN CLOSE(F);END;
PROCEDURE BCLOSE(VAR F:BYTEFILE);BEGIN CLOSE(F);END;
PROCEDURE WCLOSE(VAR F:WORDFILE);BEGIN CLOSE(F);END;{:27}{30:}
FUNCTION INPUTLN(VAR F:ALPHAFILE;BYPASSEOLN:BOOLEAN):BOOLEAN;LABEL 1,30;
VAR N:INTEGER;K,M:0..BUFSIZE;
BEGIN IF BYPASSEOLN THEN BEGIN IF NOT EOF(F)THEN GET(F);
IF NOT EOF(F)THEN IF F↑=CHR(10)THEN GET(F);END;LAST:=FIRST;
IF EOF(F)THEN INPUTLN:=FALSE ELSE BEGIN READ(F,AUXBUF:N);
IF BUFFER[FIRST]=12 THEN BEGIN PAGE:=PAGE+1;LINE:=1;END;
1:IF LAST+N>MAXBUFSTACK THEN IF LAST+N>=BUFSIZE THEN BEGIN MAXBUFSTACK:=
BUFSIZE;OVERFLOW(128,BUFSIZE);END ELSE MAXBUFSTACK:=LAST+N;
IF N>0 THEN BEGIN M:=LAST;IF N=72 THEN LAST:=M+71 ELSE LAST:=M+N;
FOR K:=M TO LAST-1 DO BUFFER[K]:=XORD[AUXBUF[K-M]];
IF N=72 THEN BEGIN READ(F,AUXBUF:N);GOTO 1;END;
END ELSE IF F↑=CHR(12)THEN BEGIN AUXBUF[0]:=F↑;N:=1;GOTO 1;END;
WHILE TRUE DO BEGIN IF LAST=FIRST THEN GOTO 30;
IF BUFFER[LAST-1]<>32 THEN GOTO 30;LAST:=LAST-1;END;30:INPUTLN:=TRUE;
END;END;{:30}{36:}PROCEDURE ESCI(VAR X:INTEGER);EXTERN;
FUNCTION RESCAN:BOOLEAN;EXTERN;FUNCTION TMPIN(F:STRING;
VAR S:STRING):INTEGER;EXTERN;FUNCTION CCLSW:BOOLEAN;EXTERN;
PROCEDURE PTWR1W(PTY,C:INTEGER);EXTERN;FUNCTION INITTERMINAL:BOOLEAN;
LABEL 10;VAR L:INTEGER;LINEFOUND:BOOLEAN;
TMPCORBUF:PACKED ARRAY[0..100]OF CHAR;BEGIN;ESCI(INTERRUPT);LAST:=FIRST;
IF CCLSW THEN BEGIN L:=TMPIN('MF',TMPCORBUF);CURINPUT.LOCFIELD:=1;
WHILE(CURINPUT.LOCFIELD<L)AND(TMPCORBUF[CURINPUT.LOCFIELD]<>'←')DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
WHILE CURINPUT.LOCFIELD<L DO BEGIN IF TMPCORBUF[CURINPUT.LOCFIELD]>' '
THEN BEGIN BUFFER[LAST]:=XORD[TMPCORBUF[CURINPUT.LOCFIELD]];
LAST:=LAST+1;END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
END ELSE IF FALSE THEN IF RESCAN THEN BEGIN READLN(TTY);
WHILE(NOT EOLN(TTY))AND(TTY↑<>';')DO GET(TTY);
IF TTY↑=';'THEN BEGIN GET(TTY);
WHILE NOT EOLN(TTY)DO BEGIN BUFFER[LAST]:=XORD[TTY↑];LAST:=LAST+1;
GET(TTY);END;END;END;LINEFOUND:=(LAST>FIRST);
WHILE TRUE DO BEGIN CURINPUT.LOCFIELD:=FIRST;
WHILE(CURINPUT.LOCFIELD<LAST)AND(BUFFER[CURINPUT.LOCFIELD]=32)DO
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
IF CURINPUT.LOCFIELD<LAST THEN BEGIN INITTERMINAL:=TRUE;GOTO 10;END;
IF LINEFOUND THEN WRITELN(TTY,'Please type the name of your input file.'
);WAKEUPTERMIN;WRITE(TTY,'**');BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN BEGIN WRITELN(TTY);
WRITE(TTY,'! End of file on the terminal... why?');INITTERMINAL:=FALSE;
GOTO 10;END;LINEFOUND:=TRUE;END;10:END;{:36}{44:}
FUNCTION MAKESTRING:STRNUMBER;
BEGIN IF STRPTR=MAXSTRPTR THEN BEGIN IF STRPTR=MAXSTRINGS THEN OVERFLOW(
130,MAXSTRINGS-INITSTRPTR);MAXSTRPTR:=MAXSTRPTR+1;END;STRREF[STRPTR]:=1;
STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;MAKESTRING:=STRPTR-1;END;
{:44}{45:}FUNCTION STREQBUF(S:STRNUMBER;K:INTEGER):BOOLEAN;LABEL 45;
VAR J:POOLPOINTER;RESULT:BOOLEAN;BEGIN J:=STRSTART[S];
WHILE J<STRSTART[S+1]DO BEGIN IF STRPOOL[J]<>BUFFER[K]THEN BEGIN RESULT
:=FALSE;GOTO 45;END;J:=J+1;K:=K+1;END;RESULT:=TRUE;45:STREQBUF:=RESULT;
END;{:45}{46:}FUNCTION STRVSSTR(S,T:STRNUMBER):INTEGER;LABEL 10;
VAR J,K:POOLPOINTER;LS,LT:INTEGER;L:INTEGER;
BEGIN LS:=(STRSTART[S+1]-STRSTART[S]);LT:=(STRSTART[T+1]-STRSTART[T]);
IF LS<=LT THEN L:=LS ELSE L:=LT;J:=STRSTART[S];K:=STRSTART[T];
WHILE L>0 DO BEGIN IF STRPOOL[J]<>STRPOOL[K]THEN BEGIN STRVSSTR:=STRPOOL
[J]-STRPOOL[K];GOTO 10;END;J:=J+1;K:=K+1;L:=L-1;END;STRVSSTR:=LS-LT;
10:END;{:46}{47:}FUNCTION GETSTRINGSST:BOOLEAN;LABEL 30,10;
VAR K,L:0..127;M,N:CHAR;G:STRNUMBER;A:INTEGER;C:BOOLEAN;
BEGIN POOLPTR:=0;STRPTR:=0;MAXPOOLPTR:=0;MAXSTRPTR:=0;STRSTART[0]:=0;
{48:}FOR K:=0 TO 127 DO BEGIN IF({49:}(K=127)OR(K IN[0,9..13,27]){:49}
)THEN BEGIN BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
BEGIN STRPOOL[POOLPTR]:=94;POOLPTR:=POOLPTR+1;END;
IF K<64 THEN BEGIN STRPOOL[POOLPTR]:=K+64;POOLPTR:=POOLPTR+1;
END ELSE BEGIN STRPOOL[POOLPTR]:=K-64;POOLPTR:=POOLPTR+1;END;
END ELSE BEGIN STRPOOL[POOLPTR]:=K;POOLPTR:=POOLPTR+1;END;G:=MAKESTRING;
STRREF[G]:=127;END{:48};{51:}NAMEOFFILE:=POOLNAME;
IF AOPENIN(POOLFILE)THEN BEGIN C:=FALSE;REPEAT{52:}
BEGIN IF EOF(POOLFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL has no check sum.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;READ(POOLFILE,M,N);IF M='*'THEN{53:}
BEGIN A:=0;K:=1;
WHILE TRUE DO BEGIN IF(XORD[N]<48)OR(XORD[N]>57)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL check sum doesn''t have nine digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;A:=10*A+XORD[N]-48;
IF K=9 THEN GOTO 30;K:=K+1;READ(POOLFILE,N);END;
30:IF A<>459621839 THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL doesn''t match; TANGLE me again.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;C:=TRUE;END{:53}
ELSE BEGIN IF(XORD[M]<48)OR(XORD[M]>57)OR(XORD[N]<48)OR(XORD[N]>57)THEN
BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! MF.POOL line doesn''t begin with two digits.');
ACLOSE(POOLFILE);GETSTRINGSST:=FALSE;GOTO 10;END;
L:=XORD[M]*10+XORD[N]-48*11;
IF POOLPTR+L+STRINGVACANC>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! You have to increase POOLSIZE.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END;
FOR K:=1 TO L DO BEGIN IF EOLN(POOLFILE)THEN M:=' 'ELSE READ(POOLFILE,M)
;BEGIN STRPOOL[POOLPTR]:=XORD[M];POOLPTR:=POOLPTR+1;END;END;
READLN(POOLFILE);G:=MAKESTRING;STRREF[G]:=127;END;END{:52};UNTIL C;
ACLOSE(POOLFILE);GETSTRINGSST:=TRUE;END ELSE BEGIN WAKEUPTERMIN;
WRITELN(TTY,'! I can''t read MF.POOL.');ACLOSE(POOLFILE);
GETSTRINGSST:=FALSE;GOTO 10;END{:51};10:END;{:47}{64:}
PROCEDURE PRINTDD(N:INTEGER);BEGIN N:=ABS(N)MOD 100;
PRINTCHAR(48+(N DIV 10));PRINTCHAR(48+(N MOD 10));END;{:64}{65:}
PROCEDURE TERMINPUT;VAR K:0..BUFSIZE;BEGIN BREAK(TTY);BUFFER[FIRST]:=0;
IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);TERMOFFSET:=0;
SELECTOR:=SELECTOR-1;
IF LAST<>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINT(BUFFER[K]);PRINTLN;
BUFFER[LAST]:=37;SELECTOR:=SELECTOR+1;END;{:65}{85:}
PROCEDURE NORMALIZESEL;
BEGIN IF JOBNAME>0 THEN SELECTOR:=3 ELSE SELECTOR:=1;
IF INTERACTION=0 THEN SELECTOR:=SELECTOR-1;
IF JOBNAME=0 THEN OPENLOGFILE;END;{:85}{91:}PROCEDURE PAUSEFORINST;
BEGIN IF OKTOINTERRUP THEN BEGIN INTERACTION:=3;
IF(SELECTOR=2)OR(SELECTOR=0)THEN SELECTOR:=SELECTOR+1;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(166);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=167;HELPLINE[1]:=168;HELPLINE[0]:=169;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;INTERRUPT:=0;END;END;{:91}
{92:}PROCEDURE MISSINGERR(S:STRNUMBER);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(170);
END;PRINT(S);PRINT(171);END;{:92}{97:}PROCEDURE CLEARARITH;
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(172);
END;BEGIN HELPPTR:=4;HELPLINE[3]:=173;HELPLINE[2]:=174;HELPLINE[1]:=175;
HELPLINE[0]:=176;END;ERROR;ARITHERROR:=FALSE;END;{:97}{99:}
FUNCTION ROUNDDECIMAL(K:SMALLNUMBER):SCALED;VAR A:INTEGER;BEGIN A:=0;
WHILE K>0 DO BEGIN K:=K-1;A:=(A+DIG[K]*131072)DIV 10;END;
ROUNDDECIMAL:=(A+1)DIV 2;END;{:99}{104:}
FUNCTION MAKEFRACTION(P,Q:INTEGER):FRACTION;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<=0 THEN BEGIN IF Q=0 THEN CONFUSION(47);Q:=-Q;
NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;P:=P MOD Q;
IF N<8 THEN N:=(N-1)*268435456 ELSE BEGIN ARITHERROR:=TRUE;
N:=1610612736;END;{105:}F:=1;REPEAT BECAREFUL:=P-Q;P:=BECAREFUL+P;
IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;UNTIL F>=268435456;
BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:105};
IF NEGATIVE THEN MAKEFRACTION:=-(F+N)ELSE MAKEFRACTION:=F+N;END;{:104}
{106:}FUNCTION TAKEFRACTION(Q:INTEGER;F:FRACTION):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{107:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:107};
IF F<268435456 THEN N:=0 ELSE BEGIN N:=F DIV 268435456;
F:=F MOD 268435456;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+268435456;{108:}P:=134217728;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:108};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKEFRACTION:=-(N+P)ELSE TAKEFRACTION:=N+P;END;{:106}
{109:}FUNCTION TAKESCALED(Q:INTEGER;F:SCALED):INTEGER;VAR P:INTEGER;
NEGATIVE:BOOLEAN;N:INTEGER;BECAREFUL:INTEGER;BEGIN{107:}
IF F>=0 THEN NEGATIVE:=FALSE ELSE BEGIN F:=-F;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;{:107};
IF F<65536 THEN N:=0 ELSE BEGIN N:=F DIV 65536;F:=F MOD 65536;
IF Q<=2147483647 DIV N THEN N:=N*Q ELSE BEGIN ARITHERROR:=TRUE;
N:=2147483647;END;END;F:=F+65536;{110:}P:=32768;
IF Q<1073741824 THEN REPEAT IF ODD(F)THEN P:=(P+Q)DIV 2 ELSE P:=(P)DIV 2
;F:=(F)DIV 2;
UNTIL F=1 ELSE REPEAT IF ODD(F)THEN P:=P+(Q-P)DIV 2 ELSE P:=(P)DIV 2;
F:=(F)DIV 2;UNTIL F=1{:110};BECAREFUL:=N-2147483647;
IF BECAREFUL+P>0 THEN BEGIN ARITHERROR:=TRUE;N:=2147483647-P;END;
IF NEGATIVE THEN TAKESCALED:=-(N+P)ELSE TAKESCALED:=N+P;END;{:109}{111:}
FUNCTION MAKESCALED(P,Q:INTEGER):SCALED;VAR F:INTEGER;N:INTEGER;
NEGATIVE:BOOLEAN;BECAREFUL:INTEGER;
BEGIN IF P>=0 THEN NEGATIVE:=FALSE ELSE BEGIN P:=-P;NEGATIVE:=TRUE;END;
IF Q<0 THEN BEGIN Q:=-Q;NEGATIVE:=NOT NEGATIVE;END;N:=P DIV Q;
P:=P MOD Q;IF N<32768 THEN N:=(N-1)*65536 ELSE BEGIN ARITHERROR:=TRUE;
N:=2147352576;END;{112:}F:=1;REPEAT BECAREFUL:=P-Q;P:=BECAREFUL+P;
IF P>=0 THEN F:=F+F+1 ELSE BEGIN F:=F+F;P:=P+Q;END;UNTIL F>=65536;
BECAREFUL:=P-Q;IF BECAREFUL+P>=0 THEN F:=F+1{:112};
IF NEGATIVE THEN MAKESCALED:=-(F+N)ELSE MAKESCALED:=F+N;END;{:111}{113:}
FUNCTION VELOCITY(ST,CT,SF,CF:FRACTION;T:SCALED):FRACTION;
VAR ACC,NUM,DENOM:INTEGER;
BEGIN ACC:=TAKEFRACTION(ST-(SF DIV 16),SF-(ST DIV 16));
ACC:=TAKEFRACTION(ACC,CT-CF);NUM:=536870912+TAKEFRACTION(ACC,379625062);
DENOM:=805306368+TAKEFRACTION(CT,497706707)+TAKEFRACTION(CF,307599661);
IF T<>65536 THEN NUM:=MAKESCALED(NUM,T);
IF NUM DIV 4>=DENOM THEN VELOCITY:=1073741824 ELSE VELOCITY:=
MAKEFRACTION(NUM,DENOM);END;{:113}{114:}
FUNCTION ABVSCD(A,B,C,D:INTEGER):INTEGER;LABEL 10;VAR Q,R:INTEGER;
BEGIN{115:}IF A<0 THEN BEGIN A:=-A;B:=-B;END;IF C<0 THEN BEGIN C:=-C;
D:=-D;END;
IF D<=0 THEN BEGIN IF B>=0 THEN IF((A=0)OR(B=0))AND((C=0)OR(D=0))THEN
BEGIN ABVSCD:=0;GOTO 10;END ELSE BEGIN ABVSCD:=1;GOTO 10;END;
IF D=0 THEN IF A=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A;A:=C;C:=Q;Q:=-B;B:=-D;D:=Q;
END ELSE IF B<=0 THEN BEGIN IF B<0 THEN IF A>0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;IF C=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;END{:115};
WHILE TRUE DO BEGIN Q:=A DIV D;R:=C DIV B;
IF Q<>R THEN IF Q>R THEN BEGIN ABVSCD:=1;GOTO 10;
END ELSE BEGIN ABVSCD:=-1;GOTO 10;END;Q:=A MOD D;R:=C MOD B;
IF R=0 THEN IF Q=0 THEN BEGIN ABVSCD:=0;GOTO 10;
END ELSE BEGIN ABVSCD:=1;GOTO 10;END;IF Q=0 THEN BEGIN ABVSCD:=-1;
GOTO 10;END;A:=B;B:=Q;C:=D;D:=R;END;10:END;{:114}{116:}
FUNCTION FLOORSCALED(X:SCALED):SCALED;VAR BECAREFUL:INTEGER;
BEGIN IF X>=0 THEN FLOORSCALED:=65536*(X DIV 65536)ELSE BEGIN BECAREFUL
:=X+1;FLOORSCALED:=-65536*(1+((-BECAREFUL)DIV 65536));END;END;
FUNCTION FLOORUNSCALE(X:SCALED):INTEGER;VAR BECAREFUL:INTEGER;
BEGIN IF X>=0 THEN FLOORUNSCALE:=X DIV 65536 ELSE BEGIN BECAREFUL:=X+1;
FLOORUNSCALE:=-(1+((-BECAREFUL)DIV 65536));END;END;
FUNCTION ROUNDUNSCALE(X:SCALED):INTEGER;VAR BECAREFUL:INTEGER;
BEGIN IF X>=32768 THEN ROUNDUNSCALE:=1+((X-32768)DIV 65536)ELSE IF X>=
-32768 THEN ROUNDUNSCALE:=0 ELSE BEGIN BECAREFUL:=X+1;
ROUNDUNSCALE:=-(1+((-BECAREFUL-32768)DIV 65536));END;END;
FUNCTION ROUNDFRACTIO(X:FRACTION):SCALED;VAR BECAREFUL:INTEGER;
BEGIN IF X>=2048 THEN ROUNDFRACTIO:=1+((X-2048)DIV 4096)ELSE IF X>=-2048
THEN ROUNDFRACTIO:=0 ELSE BEGIN BECAREFUL:=X+1;
ROUNDFRACTIO:=-(1+((-BECAREFUL-2048)DIV 4096));END;END;{:116}{118:}
FUNCTION SQUARERT(X:SCALED):SCALED;VAR K:SMALLNUMBER;Y,Q:INTEGER;
BEGIN IF X<=0 THEN{119:}
BEGIN IF X<0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(177);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=179;HELPLINE[0]:=180;END;ERROR;END;SQUARERT:=0;END{:119}
ELSE BEGIN K:=23;Q:=2;WHILE X<536870912 DO BEGIN K:=K-1;X:=X+X+X+X;END;
IF X<1073741824 THEN Y:=0 ELSE BEGIN X:=X-1073741824;Y:=1;END;
REPEAT{120:}X:=X+X;Y:=Y+Y;IF X>=1073741824 THEN BEGIN X:=X-1073741824;
Y:=Y+1;END;X:=X+X;Y:=Y+Y-Q;Q:=Q+Q;
IF X>=1073741824 THEN BEGIN X:=X-1073741824;Y:=Y+1;END;
IF Y>Q THEN BEGIN Y:=Y-Q;Q:=Q+2;END ELSE IF Y<=0 THEN BEGIN Q:=Q-2;
Y:=Y+Q;END;K:=K-1{:120};UNTIL K=0;SQUARERT:=(Q)DIV 2;END;END;{:118}
{121:}FUNCTION PYTHADD(A,B:INTEGER):INTEGER;LABEL 30;VAR R:FRACTION;
BIG:BOOLEAN;BEGIN A:=ABS(A);B:=ABS(B);IF A<B THEN BEGIN R:=B;B:=A;A:=R;
END;
IF A>0 THEN BEGIN IF A<536870912 THEN BIG:=FALSE ELSE BEGIN A:=A DIV 4;
B:=B DIV 4;BIG:=TRUE;END;{122:}WHILE TRUE DO BEGIN R:=MAKEFRACTION(B,A);
R:=TAKEFRACTION(R,R);IF R=0 THEN GOTO 30;
R:=MAKEFRACTION(R,1073741824+R);A:=A+TAKEFRACTION(A+A,R);
B:=TAKEFRACTION(B,R);END;30:{:122};
IF BIG THEN IF A<536870912 THEN A:=A+A+A+A ELSE BEGIN ARITHERROR:=TRUE;
A:=2147483647;END;END;PYTHADD:=A;END;{:121}{126:}
FUNCTION MLOG(X:SCALED):SCALED;VAR Y,Z:INTEGER;K:INTEGER;
BEGIN IF X<=0 THEN{128:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(181);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=182;HELPLINE[0]:=180;END;ERROR;MLOG:=0;END{:128}
ELSE BEGIN Y:=1302456860;Z:=6581195;WHILE X<1073741824 DO BEGIN X:=X+X;
Y:=Y-93032639;Z:=Z-48782;END;Y:=Y+(Z DIV 65536);K:=2;
WHILE X>1073741828 DO{127:}BEGIN Z:=((X-1)DIV TWOTOTHE[K])+1;
WHILE X<1073741824+Z DO BEGIN Z:=(Z+1)DIV 2;K:=K+1;END;Y:=Y+SPECLOG[K];
X:=X-Z;END{:127};MLOG:=Y DIV 8;END;END;{:126}{129:}
FUNCTION MEXP(X:SCALED):SCALED;VAR K:SMALLNUMBER;Y,Z:INTEGER;
BEGIN IF X>174436200 THEN BEGIN ARITHERROR:=TRUE;MEXP:=2147483647;
END ELSE IF X<-197694359 THEN MEXP:=0 ELSE BEGIN IF X<=0 THEN BEGIN Z:=
-8*X;Y:=1048576;
END ELSE BEGIN IF X<=127919879 THEN Z:=1023359037-8*X ELSE Z:=8*(
174436200-X);Y:=2147483647;END;{130:}K:=1;
WHILE Z>0 DO BEGIN WHILE Z>=SPECLOG[K]DO BEGIN Z:=Z-SPECLOG[K];
Y:=Y-1-((Y-TWOTOTHE[K-1])DIV TWOTOTHE[K]);END;K:=K+1;END{:130};
IF X<=127919879 THEN MEXP:=(Y+8)DIV 16 ELSE MEXP:=Y;END;END;{:129}{133:}
FUNCTION NARG(X,Y:INTEGER):ANGLE;VAR Z:ANGLE;T:INTEGER;K:SMALLNUMBER;
OCTANT:1..8;BEGIN IF X>=0 THEN OCTANT:=1 ELSE BEGIN X:=-X;OCTANT:=2;END;
IF Y<0 THEN BEGIN Y:=-Y;OCTANT:=OCTANT+2;END;IF X<Y THEN BEGIN T:=Y;
Y:=X;X:=T;OCTANT:=OCTANT+4;END;IF X=0 THEN{134:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(183);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=184;HELPLINE[0]:=180;END;ERROR;
NARG:=0;END{:134}ELSE BEGIN{136:}
WHILE X>=536870912 DO BEGIN X:=(X)DIV 2;Y:=(Y)DIV 2;END;Z:=0;
IF Y>0 THEN BEGIN WHILE X<268435456 DO BEGIN X:=X+X;Y:=Y+Y;END;{137:}
K:=0;REPEAT Y:=Y+Y;K:=K+1;IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];T:=X;
X:=X+(Y DIV TWOTOTHE[K+K]);Y:=Y-T;END;UNTIL K=15;REPEAT Y:=Y+Y;K:=K+1;
IF Y>X THEN BEGIN Z:=Z+SPECATAN[K];Y:=Y-X;END;UNTIL K=26{:137};END{:136}
;{135:}CASE OCTANT OF 1:NARG:=Z;5:NARG:=94371840-Z;6:NARG:=94371840+Z;
2:NARG:=188743680-Z;4:NARG:=Z-188743680;8:NARG:=-Z-94371840;
7:NARG:=Z-94371840;3:NARG:=-Z;END{:135};END;END;{:133}{139:}
PROCEDURE NSINCOS(Z:ANGLE);VAR K:SMALLNUMBER;Q:0..7;R:FRACTION;
X,Y,T:INTEGER;BEGIN WHILE Z<0 DO Z:=Z+377487360;Z:=Z MOD 377487360;
Q:=Z DIV 47185920;Z:=Z MOD 47185920;X:=268435456;Y:=X;
IF NOT ODD(Q)THEN Z:=47185920-Z;{141:}K:=1;
WHILE Z>0 DO BEGIN IF Z>=SPECATAN[K]THEN BEGIN Z:=Z-SPECATAN[K];T:=X;
X:=T+Y DIV TWOTOTHE[K];Y:=Y-T DIV TWOTOTHE[K];END;K:=K+1;END;
IF Y<0 THEN Y:=0{:141};{140:}CASE Q OF 0:;1:BEGIN T:=X;X:=Y;Y:=T;END;
2:BEGIN T:=X;X:=-Y;Y:=T;END;3:X:=-X;4:BEGIN X:=-X;Y:=-Y;END;
5:BEGIN T:=X;X:=-Y;Y:=-T;END;6:BEGIN T:=X;X:=Y;Y:=-T;END;7:Y:=-Y;
END{:140};R:=PYTHADD(X,Y);NCOS:=MAKEFRACTION(X,R);
NSIN:=MAKEFRACTION(Y,R);END;{:139}{143:}PROCEDURE NEWRANDOMS;
VAR K:0..54;X:FRACTION;
BEGIN FOR K:=0 TO 23 DO BEGIN X:=RANDOMS[K]-RANDOMS[K+31];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;
FOR K:=24 TO 54 DO BEGIN X:=RANDOMS[K]-RANDOMS[K-24];
IF X<0 THEN X:=X+268435456;RANDOMS[K]:=X;END;JRANDOM:=54;END;{:143}
{144:}PROCEDURE INITRANDOMS(SEED:SCALED);VAR J,JJ,K:FRACTION;I:0..54;
BEGIN J:=ABS(SEED);WHILE J>=268435456 DO J:=(J)DIV 2;K:=1;
FOR I:=0 TO 54 DO BEGIN JJ:=K;K:=J-K;J:=JJ;IF K<0 THEN K:=K+268435456;
RANDOMS[(I*21)MOD 55]:=J;END;NEWRANDOMS;NEWRANDOMS;NEWRANDOMS;END;{:144}
{145:}FUNCTION UNIFRAND(X:SCALED):SCALED;VAR Y:SCALED;
BEGIN IF X<=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(185);END;PRINTSCALED(X);PRINT(178);BEGIN HELPPTR:=2;
HELPLINE[1]:=186;HELPLINE[0]:=180;END;ERROR;UNIFRAND:=0;
END ELSE BEGIN IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
Y:=TAKEFRACTION(X,RANDOMS[JRANDOM]);
IF Y=X THEN UNIFRAND:=0 ELSE UNIFRAND:=Y;END;END;{:145}{146:}
FUNCTION NORMRAND:SCALED;VAR X,U,L:INTEGER;
BEGIN REPEAT REPEAT IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1
;X:=TAKEFRACTION(112429,RANDOMS[JRANDOM]-134217728);
IF JRANDOM=0 THEN NEWRANDOMS ELSE JRANDOM:=JRANDOM-1;
U:=RANDOMS[JRANDOM];UNTIL ABS(X)<U;X:=MAKEFRACTION(X,U);
L:=139548960-MLOG(U);UNTIL ABVSCD(1024,L,X,X)>=0;NORMRAND:=X;END;{:146}
{151:}PROCEDURE PRINTWORD(W:MEMORYWORD);BEGIN PRINTINT(W.INT);
PRINTCHAR(32);PRINTSCALED(W.INT);PRINTCHAR(32);
PRINTSCALED(W.INT DIV 4096);PRINTLN;PRINTINT(W.HH.LH);PRINTCHAR(61);
PRINTINT(W.HH.B0);PRINTCHAR(58);PRINTINT(W.HH.B1);PRINTCHAR(59);
PRINTINT(W.HH.RH);PRINTCHAR(32);PRINTINT(W.QQQQ.B0);PRINTCHAR(58);
PRINTINT(W.QQQQ.B1);PRINTCHAR(58);PRINTINT(W.QQQQ.B2);PRINTCHAR(58);
PRINTINT(W.QQQQ.B3);END;{:151}{156:}{211:}
PROCEDURE SHOWTOKENLIS(P,Q:INTEGER;L:INTEGER);LABEL 10;
VAR CLASS,C:SMALLNUMBER;R,V:INTEGER;BEGIN CLASS:=3;TALLY:=0;
WHILE(P<>0)AND(TALLY<L)DO BEGIN IF P=Q THEN{602:}
BEGIN FIRSTCOUNT:=TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END{:602};{212:}C:=9;
IF(P<27)OR(P>MEMEND)THEN BEGIN PRINT(350);GOTO 10;END;
IF P<26000 THEN{213:}IF MEM[P].HH.LH=40 THEN{214:}
BEGIN IF CLASS=0 THEN PRINTCHAR(32);V:=MEM[P+1].INT;
IF V<0 THEN BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINTCHAR(91);
PRINTSCALED(V);PRINTCHAR(93);C:=18;END ELSE BEGIN PRINTSCALED(V);C:=0;
END;END{:214}
ELSE IF MEM[P].HH.LH<>41 THEN PRINT(353)ELSE BEGIN PRINTCHAR(34);
PRINT(MEM[P+1].INT);PRINTCHAR(34);C:=4;END{:213}
ELSE BEGIN R:=MEM[P].HH.LH;IF R>=2244 THEN{216:}
BEGIN IF R<2544 THEN BEGIN PRINT(355);R:=R-(2394);
END ELSE IF R<2694 THEN BEGIN PRINT(356);R:=R-(2544);
END ELSE BEGIN PRINT(357);R:=R-(2694);END;PRINTINT(R);PRINTCHAR(41);
C:=0;END{:216}ELSE IF R<1 THEN IF R=0 THEN{215:}
BEGIN IF CLASS=17 THEN PRINTCHAR(32);PRINT(354);C:=18;END{:215}
ELSE PRINT(351)ELSE BEGIN R:=HASH[R].RH;
IF(R<0)OR(R>=STRPTR)THEN PRINT(352)ELSE{217:}
BEGIN C:=CHARCLASS[STRPOOL[STRSTART[R]]];
IF C=CLASS THEN CASE C OF 9:PRINTCHAR(46);5,6,7,8:;
OTHERS:PRINTCHAR(32)END;PRINT(R);END{:217};END;END{:212};CLASS:=C;
P:=MEM[P].HH.RH;END;IF P<>0 THEN PRINT(349);10:END;{:211}{621:}
PROCEDURE RUNAWAY;BEGIN IF SCANNERSTATU>2 THEN BEGIN PRINTNL(479);
CASE SCANNERSTATU OF 3:PRINT(480);4,5:PRINT(481);6:PRINT(482);END;
PRINTLN;SHOWTOKENLIS(MEM[26001].HH.RH,0,ERRORLINE-10);END;END;{:621}
{:156}{157:}FUNCTION GETAVAIL:HALFWORD;VAR P:HALFWORD;BEGIN P:=AVAIL;
IF P<>0 THEN AVAIL:=MEM[AVAIL].HH.RH ELSE IF MEMEND<MEMMAX THEN BEGIN
MEMEND:=MEMEND+1;P:=MEMEND;END ELSE BEGIN RUNAWAY;
OVERFLOW(187,MEMMAX-25999);END;MEM[P].HH.RH:=0;DYNUSED:=DYNUSED+1;
GETAVAIL:=P;END;{:157}{161:}FUNCTION GETNODE(S:INTEGER):HALFWORD;
LABEL 40,10;VAR P:HALFWORD;Q:HALFWORD;R:INTEGER;T:HALFWORD;
BEGIN P:=ROVER;REPEAT{162:}Q:=P+MEM[P].HH.LH;
WHILE(MEM[Q].HH.RH=262143)DO{163:}BEGIN T:=MEM[Q+1].HH.RH;
IF Q=ROVER THEN ROVER:=T;MEM[T+1].HH.LH:=MEM[Q+1].HH.LH;
MEM[MEM[Q+1].HH.LH+1].HH.RH:=T;Q:=Q+MEM[Q].HH.LH;END{:163};R:=Q-S;
IF R>P+1 THEN{164:}BEGIN MEM[P].HH.LH:=R-P;ROVER:=P;GOTO 40;END{:164};
IF R=P THEN IF((MEM[P+1].HH.RH<>ROVER)OR(MEM[P+1].HH.LH<>ROVER))THEN{165
:}BEGIN ROVER:=MEM[P+1].HH.RH;T:=MEM[P+1].HH.LH;MEM[ROVER+1].HH.LH:=T;
MEM[T+1].HH.RH:=ROVER;GOTO 40;END{:165};MEM[P].HH.LH:=Q-P{:162};
P:=MEM[P+1].HH.RH;UNTIL P=ROVER;
IF S=1073741824 THEN BEGIN GETNODE:=262143;GOTO 10;END;
OVERFLOW(188,26000);40:MEM[R].HH.RH:=0;VARUSED:=VARUSED+S;
IF VARUSED>MAXVARUSED THEN MAXVARUSED:=VARUSED;GETNODE:=R;10:END;{:161}
{166:}PROCEDURE FREENODE(P:HALFWORD;S:HALFWORD);VAR Q:HALFWORD;
BEGIN IF{169:}(P<27)OR(P>=26000){:169}THEN CONFUSION(189);
MEM[P].HH.LH:=S;MEM[P].HH.RH:=262143;Q:=MEM[ROVER+1].HH.LH;
MEM[P+1].HH.LH:=Q;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;
MEM[Q+1].HH.RH:=P;VARUSED:=VARUSED-S;END;{:166}{167:}
PROCEDURE SORTAVAIL;VAR P,Q,R:HALFWORD;OLDROVER:HALFWORD;
BEGIN P:=GETNODE(1073741824);P:=MEM[ROVER+1].HH.RH;
MEM[ROVER+1].HH.RH:=262143;OLDROVER:=ROVER;WHILE P<>OLDROVER DO{168:}
IF P<ROVER THEN BEGIN Q:=P;P:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=ROVER;
ROVER:=Q;END ELSE BEGIN Q:=ROVER;
WHILE MEM[Q+1].HH.RH<P DO Q:=MEM[Q+1].HH.RH;R:=MEM[P+1].HH.RH;
MEM[P+1].HH.RH:=MEM[Q+1].HH.RH;MEM[Q+1].HH.RH:=P;P:=R;END{:168};
P:=ROVER;
WHILE MEM[P+1].HH.RH<>262143 DO BEGIN MEM[MEM[P+1].HH.RH+1].HH.LH:=P;
P:=MEM[P+1].HH.RH;END;MEM[P+1].HH.RH:=ROVER;MEM[ROVER+1].HH.LH:=P;END;
{:167}{172:}PROCEDURE FLUSHLIST(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P>=26004 DO BEGIN Q:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;P:=Q;END;END;
PROCEDURE FLUSHNODELIS(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q<26000 THEN FREENODE(Q,2)ELSE BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;
DYNUSED:=DYNUSED-1;END;END;END;{:172}{175:}
PROCEDURE CHECKMEM(PRINTLOCS:BOOLEAN);LABEL 31,32;VAR P,Q,R:HALFWORD;
CLOBBERED:BOOLEAN;BEGIN FOR P:=0 TO MEMEND DO FREE[P]:=FALSE;{176:}
P:=AVAIL;Q:=0;CLOBBERED:=FALSE;
WHILE P<>0 DO BEGIN IF(P>MEMEND)OR(P<26004)THEN CLOBBERED:=TRUE ELSE IF
FREE[P]THEN CLOBBERED:=TRUE;IF CLOBBERED THEN BEGIN PRINTNL(190);
PRINTINT(Q);GOTO 31;END;FREE[P]:=TRUE;Q:=P;P:=MEM[Q].HH.RH;END;31:{:176}
;{177:}P:=ROVER;Q:=0;CLOBBERED:=FALSE;
REPEAT IF(P>=26000)OR(P<27)THEN CLOBBERED:=TRUE ELSE IF(MEM[P+1].HH.RH>=
26000)OR(MEM[P+1].HH.RH<27)THEN CLOBBERED:=TRUE ELSE IF NOT((MEM[P].HH.
RH=262143))OR(MEM[P].HH.LH<2)OR(P+MEM[P].HH.LH>26000)OR(MEM[MEM[P+1].HH.
RH+1].HH.LH<>P)THEN CLOBBERED:=TRUE;
IF CLOBBERED THEN BEGIN PRINTNL(191);PRINTINT(Q);GOTO 32;END;
FOR Q:=P TO P+MEM[P].HH.LH-1 DO BEGIN IF FREE[Q]THEN BEGIN PRINTNL(192);
PRINTINT(Q);GOTO 32;END;FREE[Q]:=TRUE;END;Q:=P;P:=MEM[P+1].HH.RH;
UNTIL P=ROVER;32:{:177};{178:}P:=0;
WHILE P<=26000 DO BEGIN IF(MEM[P].HH.RH=262143)THEN BEGIN PRINTNL(193);
PRINTINT(P);END;WHILE(P<=26000)AND NOT FREE[P]DO P:=P+1;
WHILE(P<=26000)AND FREE[P]DO P:=P+1;END{:178};{574:}Q:=13;
P:=MEM[Q].HH.RH;
WHILE P<>13 DO BEGIN IF MEM[P+1].HH.LH<>Q THEN BEGIN PRINTNL(439);
PRINTINT(P);END;P:=MEM[P+1].HH.RH;R:=26000;
REPEAT IF MEM[P].HH.LH>=R THEN BEGIN PRINTNL(440);PRINTINT(P);END;
R:=MEM[P].HH.LH;Q:=P;P:=MEM[Q].HH.RH;UNTIL R=0;END{:574};
IF PRINTLOCS THEN{179:}BEGIN PRINTNL(194);
FOR P:=0 TO MEMEND DO IF NOT FREE[P]AND((P>WASMEMEND)OR WASFREE[P])THEN
BEGIN PRINTCHAR(32);PRINTINT(P);END;END{:179};
FOR P:=0 TO MEMEND DO WASFREE[P]:=FREE[P];WASMEMEND:=MEMEND;END;{:175}
{180:}PROCEDURE SEARCHMEM(P:HALFWORD);VAR Q:INTEGER;
BEGIN FOR Q:=0 TO MEMEND DO BEGIN IF MEM[Q].HH.RH=P THEN BEGIN PRINTNL(
195);PRINTINT(Q);PRINTCHAR(41);END;
IF MEM[Q].HH.LH=P THEN BEGIN PRINTNL(196);PRINTINT(Q);PRINTCHAR(41);END;
END;{203:}
FOR Q:=1 TO 2243 DO BEGIN IF EQTB[Q].RH=P THEN BEGIN PRINTNL(322);
PRINTINT(Q);PRINTCHAR(41);END;END{:203};END;{:180}{183:}
PROCEDURE PRINTOP(C:QUARTERWORD);
BEGIN IF C<=18 THEN PRINTTYPE(C)ELSE CASE C OF 30:PRINT(221);
31:PRINT(222);32:PRINT(223);33:PRINT(224);34:PRINT(225);35:PRINT(226);
36:PRINT(227);37:PRINT(228);38:PRINT(229);39:PRINT(230);40:PRINT(231);
41:PRINT(232);42:PRINT(233);43:PRINT(234);44:PRINT(235);45:PRINT(236);
46:PRINT(237);47:PRINT(238);48:PRINT(239);49:PRINT(240);50:PRINT(241);
51:PRINT(242);52:PRINT(243);53:PRINT(244);54:PRINT(245);55:PRINT(246);
56:PRINT(247);57:PRINT(248);58:PRINT(249);59:PRINT(250);60:PRINT(251);
61:PRINT(252);62:PRINT(253);63:PRINT(254);64:PRINT(255);65:PRINT(256);
66:PRINT(257);67:PRINTCHAR(43);68:PRINTCHAR(45);69:PRINTCHAR(42);
70:PRINTCHAR(47);71:PRINT(258);72:PRINT(259);73:PRINT(260);
74:PRINTCHAR(60);75:PRINT(261);76:PRINTCHAR(62);77:PRINT(262);
78:PRINTCHAR(61);79:PRINT(263);91:PRINT(264);92:PRINT(265);
93:PRINT(266);94:PRINT(267);95:PRINT(268);96:PRINT(269);97:PRINT(270);
80:PRINT(38);81:PRINT(271);82:PRINT(272);83:PRINT(273);84:PRINT(274);
85:PRINT(275);86:PRINT(276);87:PRINT(277);88:PRINT(278);89:PRINT(279);
OTHERS:PRINT(280)END;END;{:183}{188:}PROCEDURE FIXDATEANDTI;
VAR T:INTEGER;DATE:INTEGER;G:BOOLEAN;BEGIN CALLI(131137,,T,T,G);
DATE:=T DIV 262144;INTERNAL[15]:=((T MOD 262144)DIV 60)*65536;
INTERNAL[14]:=((DATE MOD 31)+1)*65536;
INTERNAL[13]:=(((DATE DIV 31)MOD 12)+1)*65536;
INTERNAL[12]:=((DATE DIV(31*12))+1964)*65536;
IF INTERNAL[13]=262144 THEN IF INTERNAL[14]=65536 THEN WRITELN(TTY,
'Hello! I am your user-friendly MF System.');END;{:188}{199:}
FUNCTION IDLOOKUP(J,L:INTEGER):HALFWORD;LABEL 40;VAR H:INTEGER;
P:HALFWORD;K:HALFWORD;BEGIN IF L=1 THEN{200:}BEGIN P:=BUFFER[J]+1;
HASH[P].RH:=P-1;GOTO 40;END{:200};{202:}H:=BUFFER[J];
FOR K:=J+1 TO J+L-1 DO BEGIN H:=H+H+BUFFER[K];
WHILE H>=1777 DO H:=H-1777;END{:202};P:=H+129;
WHILE TRUE DO BEGIN IF HASH[P].RH>0 THEN IF(STRSTART[HASH[P].RH+1]-
STRSTART[HASH[P].RH])=L THEN IF STREQBUF(HASH[P].RH,J)THEN GOTO 40;
IF HASH[P].LH=0 THEN{201:}
BEGIN IF HASH[P].RH>0 THEN BEGIN REPEAT IF(HASHUSED=1)THEN OVERFLOW(321,
2100);HASHUSED:=HASHUSED-1;UNTIL HASH[HASHUSED].RH=0;
HASH[P].LH:=HASHUSED;P:=HASHUSED;END;
BEGIN IF POOLPTR+L>MAXPOOLPTR THEN BEGIN IF POOLPTR+L>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+L;END;END;
FOR K:=J TO J+L-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K];
POOLPTR:=POOLPTR+1;END;HASH[P].RH:=MAKESTRING;STRREF[HASH[P].RH]:=127;
STCOUNT:=STCOUNT+1;GOTO 40;END{:201};P:=HASH[P].LH;END;40:IDLOOKUP:=P;
END;{:199}{204:}PROCEDURE PRIMITIVE(S:STRNUMBER;C:HALFWORD;O:HALFWORD);
VAR K:POOLPOINTER;J:SMALLNUMBER;L:SMALLNUMBER;BEGIN K:=STRSTART[S];
L:=STRSTART[S+1]-K;FOR J:=0 TO L-1 DO BUFFER[J]:=STRPOOL[K+J];
CURSYM:=IDLOOKUP(0,L);IF S>=128 THEN BEGIN FLUSHSTRING(STRPTR-1);
HASH[CURSYM].RH:=S;END;EQTB[CURSYM].LH:=C;EQTB[CURSYM].RH:=O;END;{:204}
{209:}FUNCTION NEWNUMTOK(V:SCALED):HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P+1].INT:=V;MEM[P].HH.LH:=40;NEWNUMTOK:=P;END;
{:209}{210:}PROCEDURE FLUSHTOKENLI(P:HALFWORD);VAR Q:HALFWORD;
BEGIN WHILE P<>0 DO BEGIN Q:=P;P:=MEM[P].HH.RH;
IF Q>=26004 THEN BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;
END ELSE BEGIN IF MEM[Q].HH.LH=41 THEN BEGIN IF STRREF[MEM[Q+1].INT]<127
THEN IF STRREF[MEM[Q+1].INT]>1 THEN STRREF[MEM[Q+1].INT]:=STRREF[MEM[Q+1
].INT]-1 ELSE FLUSHSTRING(MEM[Q+1].INT);END;FREENODE(Q,2);END;END;END;
{:210}{218:}PROCEDURE DELETEMACREF(P:HALFWORD);
BEGIN IF MEM[P].HH.LH=0 THEN FLUSHTOKENLI(P)ELSE MEM[P].HH.LH:=MEM[P].HH
.LH-1;END;{:218}{219:}{582:}PROCEDURE PRINTCMDMOD(C,M:INTEGER);
BEGIN CASE C OF{206:}17:PRINT(324);76:PRINT(323);70:PRINT(325);
31:PRINT(316);72:PRINT(326);77:PRINT(58);78:PRINT(44);58:PRINT(327);
18:PRINT(328);60:PRINT(329);26:PRINT(330);9:PRINT(331);80:PRINT(317);
25:PRINT(332);6:PRINT(333);68:PRINT(334);71:PRINT(335);11:PRINT(336);
46:PRINT(123);52:PRINT(91);12:PRINT(337);13:PRINT(338);67:PRINT(339);
27:PRINT(340);47:PRINT(280);23:PRINT(341);15:PRINT(342);7:PRINTCHAR(92);
64:PRINT(125);63:PRINT(93);10:PRINT(343);79:PRINT(59);16:PRINT(344);
73:PRINT(345);34:PRINT(346);69:PRINT(347);74:PRINT(348);{:206}{639:}
14:IF M<=2 THEN IF M=1 THEN PRINT(493)ELSE IF M<1 THEN PRINT(318)ELSE
PRINT(494)ELSE IF M=53 THEN PRINT(495)ELSE IF M=43 THEN PRINT(496)ELSE
PRINT(497);
4:IF M<=1 THEN IF M=1 THEN PRINT(500)ELSE PRINT(319)ELSE IF M=2394 THEN
PRINT(498)ELSE PRINT(499);{:639}{646:}61:CASE M OF 1:PRINT(506);
2:PRINTCHAR(64);3:PRINT(507);OTHERS:PRINT(505)END;{:646}{653:}
57:IF M>=2394 THEN IF M=2394 THEN PRINT(518)ELSE IF M=2544 THEN PRINT(
519)ELSE PRINT(520)ELSE IF M<2 THEN PRINT(521)ELSE IF M=2 THEN PRINT(522
)ELSE PRINT(523);{:653}{668:}3:IF M=0 THEN PRINT(534)ELSE PRINT(458);
{:668}{695:}1,2:CASE M OF 1:PRINT(563);2:PRINT(315);3:PRINT(564);
OTHERS:PRINT(565)END;{:695}{836:}
59:IF M=0 THEN PRINT(672)ELSE PRINT(671);{:836}{849:}
32,33,36,55,44,49,35,42,54,45,50,51:PRINTOP(M);{:849}{966:}
29:PRINTTYPE(M);{:966}{971:}81:IF M=0 THEN PRINT(756)ELSE PRINT(757);
{:971}{976:}22:CASE M OF 0:PRINT(145);1:PRINT(146);2:PRINT(147);
OTHERS:PRINT(762)END;{:976}{979:}
20:IF M=0 THEN PRINT(763)ELSE PRINT(764);{:979}{989:}
21:CASE M OF 0:PRINT(777);1:PRINT(778);2:PRINT(779);3:PRINT(780);
4:PRINT(781);5:PRINT(782);OTHERS:PRINT(783)END;{:989}{994:}
30,62:BEGIN IF C=30 THEN PRINT(789)ELSE PRINT(790);PRINT(791);
PRINT(HASH[M].RH);END;39:IF M=0 THEN PRINT(792)ELSE PRINT(793);
8:PRINT(794);53,43,48:BEGIN PRINTCMDMOD(14,C);PRINT(795);PRINTLN;
SHOWTOKENLIS(MEM[MEM[M].HH.RH].HH.RH,0,1000);END;5:PRINT(796);
38:PRINT(INTNAME[M]);{:994}{1003:}
66:IF M=0 THEN PRINT(802)ELSE IF M=1 THEN PRINT(803)ELSE PRINT(804);
65:IF M=6 THEN PRINT(805)ELSE PRINT(806);{:1003}{1028:}
24:IF M<1 THEN PRINT(835)ELSE IF M=1 THEN PRINT(836)ELSE PRINT(837);
{:1028}{1050:}19:CASE M OF 0:PRINT(848);1:PRINT(849);2:PRINT(850);
3:PRINT(851);OTHERS:PRINT(852)END;{:1050}{1058:}
75:IF M=0 THEN PRINT(872)ELSE PRINT(873);{:1058}{1123:}
28:IF M=15 THEN PRINT(893)ELSE PRINT(892);{:1123}OTHERS:PRINT(444)END;
END;{:582}PROCEDURE SHOWMACRO(P:HALFWORD;Q,L:INTEGER);LABEL 10;
VAR R:HALFWORD;BEGIN P:=MEM[P].HH.RH;
WHILE MEM[P].HH.LH>5 DO BEGIN R:=MEM[P].HH.RH;MEM[P].HH.RH:=0;
SHOWTOKENLIS(P,0,L);MEM[P].HH.RH:=R;P:=R;
IF L>0 THEN L:=L-TALLY ELSE GOTO 10;END;TALLY:=0;
CASE MEM[P].HH.LH OF 0:PRINT(358);1,2,3:BEGIN PRINTCHAR(60);
PRINTCMDMOD(57,MEM[P].HH.LH);PRINT(359);END;4:PRINT(360);5:PRINT(361);
END;SHOWTOKENLIS(MEM[P].HH.RH,Q,L-TALLY);10:END;{:219}{224:}
PROCEDURE INITBIGNODE(P:HALFWORD);VAR Q:HALFWORD;S:SMALLNUMBER;
BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];Q:=GETNODE(S);REPEAT S:=S-2;
MEM[Q+S].HH.B0:=19;MEM[Q+S+1].INT:=0;MEM[Q+S].HH.B1:=(S)DIV 2+5;
MEM[Q+S].HH.RH:=0;UNTIL S=0;MEM[Q].HH.RH:=P;MEM[P+1].INT:=Q;END;{:224}
{225:}FUNCTION IDTRANSFORM:HALFWORD;VAR P,Q,R:HALFWORD;
BEGIN P:=GETNODE(2);MEM[P].HH.B0:=13;MEM[P].HH.B1:=11;MEM[P+1].INT:=0;
INITBIGNODE(P);Q:=MEM[P+1].INT;R:=Q+12;REPEAT R:=R-2;MEM[R].HH.B0:=15;
MEM[R+1].INT:=0;UNTIL R=Q;MEM[Q+5].INT:=65536;MEM[Q+11].INT:=65536;
IDTRANSFORM:=P;END;{:225}{226:}PROCEDURE NEWROOT(X:HALFWORD);
VAR P:HALFWORD;BEGIN P:=GETNODE(2);MEM[P].HH.B0:=0;MEM[P].HH.B1:=0;
MEM[P].HH.RH:=X;EQTB[X].RH:=P;END;{:226}{227:}
PROCEDURE PRINTVARIABL(P:HALFWORD);LABEL 40,10;VAR Q:HALFWORD;
R:HALFWORD;BEGIN WHILE MEM[P].HH.B1>=5 DO{229:}
BEGIN CASE MEM[P].HH.B1 OF 5:PRINTCHAR(120);6:PRINTCHAR(121);
7:PRINT(364);8:PRINT(365);9:PRINT(366);10:PRINT(367);
11:BEGIN PRINT(368);PRINTINT(P-0);GOTO 10;END;END;PRINT(369);
P:=MEM[P-2*(MEM[P].HH.B1-5)].HH.RH;END{:229};Q:=0;
WHILE MEM[P].HH.B1>1 DO{228:}
BEGIN IF MEM[P].HH.B1=3 THEN BEGIN R:=NEWNUMTOK(MEM[P+2].INT);
REPEAT P:=MEM[P].HH.RH;UNTIL MEM[P].HH.B1=4;
END ELSE IF MEM[P].HH.B1=2 THEN BEGIN P:=MEM[P].HH.RH;GOTO 40;
END ELSE BEGIN IF MEM[P].HH.B1<>4 THEN CONFUSION(363);R:=GETAVAIL;
MEM[R].HH.LH:=MEM[P+2].HH.LH;END;MEM[R].HH.RH:=Q;Q:=R;
40:P:=MEM[P+2].HH.RH;END{:228};R:=GETAVAIL;MEM[R].HH.LH:=MEM[P].HH.RH;
MEM[R].HH.RH:=Q;IF MEM[P].HH.B1=1 THEN PRINT(362);
SHOWTOKENLIS(R,0,1000);FLUSHTOKENLI(R);10:END;{:227}{230:}
FUNCTION INTERESTING(P:HALFWORD):BOOLEAN;VAR T:SMALLNUMBER;
BEGIN T:=MEM[P].HH.B1;
IF T>=5 THEN IF T<>11 THEN T:=MEM[MEM[P-2*(T-5)].HH.RH].HH.B1;
INTERESTING:=(T<>11);END;{:230}{231:}
FUNCTION NEWSTRUCTURE(P:HALFWORD):HALFWORD;VAR Q,R:HALFWORD;
BEGIN CASE MEM[P].HH.B1 OF 0:BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(2);
EQTB[Q].RH:=R;END;3:{232:}BEGIN Q:=P;REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q].HH.B1=4;Q:=MEM[Q+2].HH.RH;R:=Q+1;REPEAT Q:=R;
R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);MEM[Q].HH.RH:=R;
MEM[R+2].INT:=MEM[P+2].INT;END{:232};4:{233:}BEGIN Q:=MEM[P+2].HH.RH;
R:=MEM[Q+1].HH.LH;REPEAT Q:=R;R:=MEM[R].HH.RH;UNTIL R=P;R:=GETNODE(3);
MEM[Q].HH.RH:=R;MEM[R+2]:=MEM[P+2];
IF MEM[P+2].HH.LH=0 THEN BEGIN Q:=MEM[P+2].HH.RH+1;
WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;END;END{:233};
OTHERS:CONFUSION(370)END;MEM[R].HH.RH:=MEM[P].HH.RH;MEM[R].HH.B0:=21;
MEM[R].HH.B1:=MEM[P].HH.B1;MEM[R+1].HH.LH:=P;MEM[P].HH.B1:=2;
Q:=GETNODE(3);MEM[P].HH.RH:=Q;MEM[R+1].HH.RH:=Q;MEM[Q+2].HH.RH:=R;
MEM[Q].HH.B0:=0;MEM[Q].HH.B1:=4;MEM[Q].HH.RH:=21;MEM[Q+2].HH.LH:=0;
NEWSTRUCTURE:=R;END;{:231}{234:}
FUNCTION FINDVARIABLE(T:HALFWORD):HALFWORD;LABEL 10;
VAR P,Q,R,S:HALFWORD;PP,QQ,RR,SS:HALFWORD;N:INTEGER;SAVEWORD:MEMORYWORD;
BEGIN P:=MEM[T].HH.LH;T:=MEM[T].HH.RH;
IF EQTB[P].LH MOD 82<>39 THEN BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF EQTB[P].RH=0 THEN NEWROOT(P);P:=EQTB[P].RH;PP:=P;
WHILE T<>0 DO BEGIN{235:}
IF MEM[PP].HH.B0<>21 THEN BEGIN IF MEM[PP].HH.B0>21 THEN BEGIN
FINDVARIABLE:=0;GOTO 10;END;SS:=NEWSTRUCTURE(PP);IF P=PP THEN P:=SS;
PP:=SS;END;IF MEM[P].HH.B0<>21 THEN P:=NEWSTRUCTURE(P){:235};
IF T<26000 THEN{236:}BEGIN N:=MEM[T+1].INT;
PP:=MEM[MEM[PP+1].HH.LH].HH.RH;Q:=MEM[MEM[P+1].HH.LH].HH.RH;
SAVEWORD:=MEM[Q+2];MEM[Q+2].INT:=2147483647;S:=P+1;REPEAT R:=S;
S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].INT;
IF N=MEM[S+2].INT THEN P:=S ELSE BEGIN P:=GETNODE(3);MEM[R].HH.RH:=P;
MEM[P].HH.RH:=S;MEM[P+2].INT:=N;MEM[P].HH.B1:=3;MEM[P].HH.B0:=0;END;
MEM[Q+2]:=SAVEWORD;END{:236}ELSE{237:}BEGIN N:=MEM[T].HH.LH;
SS:=MEM[PP+1].HH.LH;REPEAT RR:=SS;SS:=MEM[SS].HH.RH;
UNTIL N<=MEM[SS+2].HH.LH;IF N<MEM[SS+2].HH.LH THEN BEGIN QQ:=GETNODE(3);
MEM[RR].HH.RH:=QQ;MEM[QQ].HH.RH:=SS;MEM[QQ+2].HH.LH:=N;MEM[QQ].HH.B1:=4;
MEM[QQ].HH.B0:=0;MEM[QQ+2].HH.RH:=PP;SS:=QQ;END;
IF P=PP THEN BEGIN P:=SS;PP:=SS;END ELSE BEGIN PP:=SS;S:=MEM[P+1].HH.LH;
REPEAT R:=S;S:=MEM[S].HH.RH;UNTIL N<=MEM[S+2].HH.LH;
IF N=MEM[S+2].HH.LH THEN P:=S ELSE BEGIN Q:=GETNODE(3);MEM[R].HH.RH:=Q;
MEM[Q].HH.RH:=S;MEM[Q+2].HH.LH:=N;MEM[Q].HH.B1:=4;MEM[Q].HH.B0:=0;
MEM[Q+2].HH.RH:=P;P:=Q;END;END;END{:237};T:=MEM[T].HH.RH;END;
IF MEM[PP].HH.B0>=21 THEN IF MEM[PP].HH.B0=21 THEN PP:=MEM[PP+1].HH.LH
ELSE BEGIN FINDVARIABLE:=0;GOTO 10;END;
IF MEM[P].HH.B0=21 THEN P:=MEM[P+1].HH.LH;
IF MEM[P].HH.B0=0 THEN BEGIN IF MEM[PP].HH.B0=0 THEN BEGIN MEM[PP].HH.B0
:=18;MEM[PP+1].INT:=0;END;MEM[P].HH.B0:=MEM[PP].HH.B0;MEM[P+1].INT:=0;
END;FINDVARIABLE:=P;10:END;{:234}{238:}{249:}
PROCEDURE PRINTPATH(H:HALFWORD;S:STRNUMBER);LABEL 30,31;
VAR P,Q,R:HALFWORD;BEGIN PRINTDIAGNOS(371,S);PRINTLN;P:=H;
REPEAT Q:=MEM[P].HH.RH;IF(P=0)OR(Q=0)THEN BEGIN PRINTNL(131);GOTO 30;
END;{250:}PRINTTWO(MEM[P+1].INT,MEM[P+2].INT);
CASE MEM[P].HH.B1 OF 0:BEGIN IF MEM[P].HH.B0=4 THEN PRINT(372);
IF(MEM[Q].HH.B0<>0)OR(Q<>H)THEN Q:=0;GOTO 31;END;1:{253:}
BEGIN PRINT(379);PRINTTWO(MEM[P+5].INT,MEM[P+6].INT);PRINT(377);
IF MEM[Q].HH.B0<>1 THEN PRINT(380)ELSE PRINTTWO(MEM[Q+3].INT,MEM[Q+4].
INT);GOTO 31;END{:253};4:{254:}
IF(MEM[P].HH.B0<>1)AND(MEM[P].HH.B0<>4)THEN PRINT(372){:254};3,2:{255:}
BEGIN IF MEM[P].HH.B0=4 THEN PRINT(380);
IF MEM[P].HH.B1=3 THEN BEGIN PRINT(375);PRINTSCALED(MEM[P+5].INT);
END ELSE BEGIN R:=MEM[P+5].INT;PRINTCHAR(123);PRINTSCALED(MEM[R+1].INT);
PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);END;PRINTCHAR(125);END{:255};
OTHERS:PRINT(131)END;
IF MEM[Q].HH.B0<=1 THEN PRINT(373)ELSE IF(MEM[P+6].INT<>65536)OR(MEM[Q+4
].INT<>65536)THEN{252:}IF MEM[P+6].INT<>0 THEN BEGIN PRINT(376);
PRINTSCALED(MEM[P+6].INT);
IF MEM[P+6].INT<>MEM[Q+4].INT THEN BEGIN PRINT(377);
PRINTSCALED(MEM[Q+4].INT);END;END ELSE BEGIN PRINT(378);
IF MEM[Q+4].INT<>0 THEN PRINTCHAR(63);END{:252};31:{:250};P:=Q;
IF(P<>H)OR(MEM[H].HH.B0<>0)THEN{251:}BEGIN PRINTNL(374);
IF MEM[P].HH.B0=2 THEN BEGIN R:=MEM[P+3].INT;PRINTCHAR(123);
PRINTSCALED(MEM[R+1].INT);PRINTCHAR(44);PRINTSCALED(MEM[R+2].INT);
PRINTCHAR(125);END ELSE IF MEM[P].HH.B0=3 THEN BEGIN PRINT(375);
PRINTSCALED(MEM[P+3].INT);PRINTCHAR(125);END;END{:251};UNTIL P=H;
IF MEM[H].HH.B0<>0 THEN PRINT(257);30:ENDDIAGNOSTI(TRUE);END;{:249}
{324:}{325:}PROCEDURE PRINTWEIGHT(Q:HALFWORD);VAR W,M:INTEGER;D:INTEGER;
BEGIN D:=MEM[Q].HH.LH;W:=D MOD 8;M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;
IF FILEOFFSET>MAXPRINTLINE-9 THEN PRINTNL(32)ELSE PRINTCHAR(32);
PRINTINT(M);WHILE W>4 DO BEGIN PRINTCHAR(43);W:=W-1;END;
WHILE W<4 DO BEGIN PRINTCHAR(45);W:=W+1;END;END;{:325}
PROCEDURE PRINTEDGES(S:STRNUMBER);VAR P,Q:HALFWORD;N:INTEGER;
BEGIN PRINTDIAGNOS(387,S);P:=MEM[CUREDGES].HH.LH;
N:=MEM[CUREDGES+1].HH.RH-4096;WHILE P<>CUREDGES DO BEGIN PRINTNL(388);
PRINTINT(N);PRINTCHAR(58);Q:=MEM[P+1].HH.LH;
WHILE Q>1 DO BEGIN PRINTWEIGHT(Q);Q:=MEM[Q].HH.RH;END;PRINT(389);
Q:=MEM[P+1].HH.RH;WHILE Q>26000 DO BEGIN PRINTWEIGHT(Q);Q:=MEM[Q].HH.RH;
END;P:=MEM[P].HH.LH;N:=N-1;END;ENDDIAGNOSTI(TRUE);END;{:324}{374:}
PROCEDURE UNROTATE(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X;END;6:BEGIN CURX:=-Y;CURY:=X;END;2:BEGIN CURX:=-X;CURY:=Y;END;
4:BEGIN CURX:=-X;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X;END;
7:BEGIN CURX:=Y;CURY:=-X;END;3:BEGIN CURX:=X;CURY:=-Y;END;END;END;{:374}
{433:}PROCEDURE PRINTPEN(P:HALFWORD;S:STRNUMBER);
VAR NOTHINGPRINT:BOOLEAN;K:1..8;H:HALFWORD;M,N:INTEGER;W,WW:HALFWORD;
BEGIN PRINTDIAGNOS(416,S);NOTHINGPRINT:=TRUE;PRINTLN;
FOR K:=1 TO 8 DO BEGIN OCTANT:=OCTANTCODE[K];H:=P+OCTANT;
N:=MEM[H].HH.LH;W:=MEM[H].HH.RH;IF NOT ODD(K)THEN W:=MEM[W].HH.LH;
FOR M:=1 TO N+1 DO BEGIN IF ODD(K)THEN WW:=MEM[W].HH.RH ELSE WW:=MEM[W].
HH.LH;
IF(MEM[WW+1].INT<>MEM[W+1].INT)OR(MEM[WW+2].INT<>MEM[W+2].INT)THEN{434:}
BEGIN IF NOTHINGPRINT THEN NOTHINGPRINT:=FALSE ELSE PRINTNL(418);
UNROTATE(MEM[WW+1].INT+MEM[WW+2].INT,MEM[WW+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END{:434};W:=WW;END;END;
IF NOTHINGPRINT THEN BEGIN W:=MEM[P+1].HH.RH;
PRINTTWO(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT);END;PRINTNL(417);
ENDDIAGNOSTI(TRUE);END;{:433}{547:}PROCEDURE PRINTDEPENDE(P:HALFWORD;
T:SMALLNUMBER);LABEL 10;VAR V:INTEGER;PP,Q:HALFWORD;BEGIN PP:=P;
WHILE TRUE DO BEGIN V:=ABS(MEM[P+1].INT);Q:=MEM[P].HH.LH;
IF Q=0 THEN BEGIN IF(V<>0)OR(P=PP)THEN BEGIN IF MEM[P+1].INT>0 THEN IF P
<>PP THEN PRINTCHAR(43);PRINTSCALED(MEM[P+1].INT);END;GOTO 10;END;{548:}
IF MEM[P+1].INT<0 THEN PRINTCHAR(45)ELSE IF P<>PP THEN PRINTCHAR(43);
IF T=16 THEN V:=ROUNDFRACTIO(V);IF V<>65536 THEN PRINTSCALED(V){:548};
IF MEM[Q].HH.B0<>19 THEN CONFUSION(435);PRINTVARIABL(Q);V:=MEM[Q+1].INT;
WHILE V>0 DO BEGIN PRINT(436);V:=V-2;END;P:=MEM[P].HH.RH;END;10:END;
{:547}{753:}{757:}PROCEDURE PRINTDP(T:SMALLNUMBER;P:HALFWORD;
VERBOSITY:SMALLNUMBER);VAR Q:HALFWORD;BEGIN Q:=MEM[P].HH.RH;
IF(MEM[Q].HH.LH=0)OR(VERBOSITY>0)THEN PRINTDEPENDE(P,T)ELSE PRINT(611);
END;{:757}{751:}FUNCTION STASHCUREXP:HALFWORD;VAR P:HALFWORD;
BEGIN CASE CURTYPE OF 3,5,7,10,12,13,14,16,17,19:P:=CUREXP;
OTHERS:BEGIN P:=GETNODE(2);MEM[P].HH.B1:=11;MEM[P].HH.B0:=CURTYPE;
MEM[P+1].INT:=CUREXP;END END;CURTYPE:=1;MEM[P].HH.RH:=1;STASHCUREXP:=P;
END;{:751}{752:}PROCEDURE UNSTASHCUREX(P:HALFWORD);
BEGIN CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 3,5,7,10,12,13,14,16,17,19:CUREXP:=P;
OTHERS:BEGIN CUREXP:=MEM[P+1].INT;FREENODE(P,2);END END;END;{:752}
PROCEDURE PRINTEXP(P:HALFWORD;VERBOSITY:SMALLNUMBER);
VAR RESTORECUREX:BOOLEAN;T:SMALLNUMBER;V:INTEGER;Q:HALFWORD;
BEGIN IF P<>0 THEN RESTORECUREX:=FALSE ELSE BEGIN P:=STASHCUREXP;
RESTORECUREX:=TRUE;END;T:=MEM[P].HH.B0;
IF T<16 THEN V:=MEM[P+1].INT ELSE IF T<19 THEN V:=MEM[P+1].HH.RH;{754:}
CASE T OF 1:PRINT(197);2:IF V=30 THEN PRINT(221)ELSE PRINT(222);
3,5,7,10,12,18:{758:}BEGIN PRINTTYPE(T);
IF V<>0 THEN BEGIN PRINTCHAR(32);
WHILE(MEM[V].HH.B1=11)AND(V<>P)DO V:=MEM[V+1].INT;PRINTVARIABL(V);END;
END{:758};4:BEGIN PRINTCHAR(34);PRINT(V);PRINTCHAR(34);END;
6,8,9,11:{756:}
IF VERBOSITY<=1 THEN PRINTTYPE(T)ELSE BEGIN IF SELECTOR=3 THEN IF
INTERNAL[11]<=0 THEN BEGIN SELECTOR:=1;PRINTTYPE(T);PRINT(609);
SELECTOR:=3;END;CASE T OF 6:PRINTPEN(V,312);8:PRINTPATH(V,610);
11:PRINTPATH(V,312);9:BEGIN CUREDGES:=V;PRINTEDGES(312);END;END;
END{:756};13,14:IF V=0 THEN PRINTTYPE(T)ELSE{755:}BEGIN PRINTCHAR(40);
Q:=V+BIGNODESIZE[T];
REPEAT IF MEM[V].HH.B0=15 THEN PRINTSCALED(MEM[V+1].INT)ELSE IF MEM[V].
HH.B0=19 THEN PRINTVARIABL(V)ELSE PRINTDP(MEM[V].HH.B0,MEM[V+1].HH.RH,
VERBOSITY);V:=V+2;IF V<>Q THEN PRINTCHAR(44);UNTIL V=Q;PRINTCHAR(41);
END{:755};15:PRINTSCALED(V);16,17:PRINTDP(T,V,VERBOSITY);
19:PRINTVARIABL(P);OTHERS:CONFUSION(608)END{:754};
IF RESTORECUREX THEN UNSTASHCUREX(P);END;{:753}{759:}
PROCEDURE DISPERR(P:HALFWORD;S:STRNUMBER);
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(612);PRINTEXP(P,1);
IF S<>312 THEN BEGIN PRINTNL(133);PRINT(S);END;END;{:759}{552:}
FUNCTION PPLUSFQ(P:HALFWORD;F:INTEGER;Q:HALFWORD;
T,TT:SMALLNUMBER):HALFWORD;LABEL 30;VAR PP,QQ:HALFWORD;R,S:HALFWORD;
THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=16 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=26001;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{553:}
BEGIN IF TT=16 THEN V:=MEM[P+1].INT+TAKEFRACTION(F,MEM[Q+1].INT)ELSE V:=
MEM[P+1].INT+TAKESCALED(F,MEM[Q+1].INT);MEM[P+1].INT:=V;S:=P;
P:=MEM[P].HH.RH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;PP:=MEM[P].HH.LH;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:553}ELSE IF PP<QQ THEN{554:}
BEGIN IF TT=16 THEN V:=TAKEFRACTION(F,MEM[Q+1].INT)ELSE V:=TAKESCALED(F,
MEM[Q+1].INT);IF ABS(V)>(THRESHOLD)DIV 2 THEN BEGIN S:=GETNODE(2);
MEM[S].HH.LH:=QQ;MEM[S+1].INT:=V;
IF ABS(V)>=626349397 THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;
FIXNEEDED:=TRUE;END;MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;
QQ:=MEM[Q].HH.LH;END{:554}ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:IF T=16 THEN MEM[P+1].INT:=MEM[P+1].INT+TAKEFRACTION(MEM[Q+1].INT,F)
ELSE MEM[P+1].INT:=MEM[P+1].INT+TAKESCALED(MEM[Q+1].INT,F);
MEM[R].HH.RH:=P;DEPFINAL:=P;PPLUSFQ:=MEM[26001].HH.RH;END;{:552}{558:}
FUNCTION POVERV(P:HALFWORD;V:SCALED;T0,T1:SMALLNUMBER):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=FALSE;
IF T1=16 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=26001;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN IF ABS(V)<524288 THEN
W:=MAKESCALED(MEM[P+1].INT,V*4096)ELSE W:=MAKESCALED(ROUNDFRACTIO(MEM[P
+1].INT),V)ELSE W:=MAKESCALED(MEM[P+1].INT,V);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);POVERV:=MEM[26001].HH.RH;END;
{:558}{560:}PROCEDURE MAKEKNOWN(P,Q:HALFWORD);VAR T:16..17;
BEGIN MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[P+1].HH.LH;
MEM[MEM[P+1].HH.LH].HH.RH:=MEM[Q].HH.RH;T:=MEM[P].HH.B0;
MEM[P].HH.B0:=15;MEM[P+1].INT:=MEM[Q+1].INT;FREENODE(Q,2);
IF ABS(MEM[P+1].INT)>=268435456 THEN ARITHERROR:=TRUE;
IF INTERNAL[2]>0 THEN IF INTERESTING(P)THEN BEGIN BEGINDIAGNOS;
PRINTNL(437);PRINTVARIABL(P);PRINTCHAR(61);PRINTSCALED(MEM[P+1].INT);
ENDDIAGNOSTI(FALSE);END;
IF CUREXP=P THEN IF CURTYPE=T THEN BEGIN CURTYPE:=15;
CUREXP:=MEM[P+1].INT;FREENODE(P,2);END;END;{:560}{561:}
PROCEDURE FIXDEPENDENC;LABEL 30;VAR P,Q,R,S,T:HALFWORD;X:HALFWORD;
BEGIN R:=MEM[13].HH.RH;S:=0;WHILE R<>13 DO BEGIN T:=R;{562:}R:=T+1;
WHILE TRUE DO BEGIN Q:=MEM[R].HH.RH;X:=MEM[Q].HH.LH;IF X=0 THEN GOTO 30;
IF MEM[X].HH.B0<=1 THEN BEGIN IF MEM[X].HH.B0<1 THEN BEGIN P:=GETAVAIL;
MEM[P].HH.RH:=S;S:=P;MEM[S].HH.LH:=X;MEM[X].HH.B0:=1;END;
MEM[Q+1].INT:=MEM[Q+1].INT DIV 4;
IF MEM[Q+1].INT=0 THEN BEGIN MEM[R].HH.RH:=MEM[Q].HH.RH;FREENODE(Q,2);
Q:=R;END;END;R:=Q;END;30:{:562};R:=MEM[Q].HH.RH;
IF Q=MEM[T+1].HH.RH THEN MAKEKNOWN(T,Q);END;
WHILE S<>0 DO BEGIN P:=MEM[S].HH.RH;X:=MEM[S].HH.LH;
BEGIN MEM[S].HH.RH:=AVAIL;AVAIL:=S;DYNUSED:=DYNUSED-1;END;S:=P;
MEM[X].HH.B0:=19;MEM[X+1].INT:=MEM[X+1].INT+2;END;FIXNEEDED:=FALSE;END;
{:561}{260:}PROCEDURE TOSSKNOTLIST(P:HALFWORD);VAR Q:HALFWORD;
R:HALFWORD;BEGIN Q:=P;REPEAT R:=MEM[Q].HH.RH;FREENODE(Q,7);Q:=R;
UNTIL Q=P;END;{:260}{371:}PROCEDURE TOSSEDGES(H:HALFWORD);
VAR P,Q:HALFWORD;BEGIN Q:=MEM[H].HH.RH;
WHILE Q<>H DO BEGIN FLUSHLIST(MEM[Q+1].HH.RH);
IF MEM[Q+1].HH.LH>1 THEN FLUSHLIST(MEM[Q+1].HH.LH);P:=Q;Q:=MEM[Q].HH.RH;
FREENODE(P,2);END;FREENODE(H,6);END;{:371}{448:}
PROCEDURE TOSSPEN(P:HALFWORD);VAR K:1..8;W,WW:HALFWORD;
BEGIN IF P<>3 THEN BEGIN FOR K:=1 TO 8 DO BEGIN W:=MEM[P+K].HH.RH;
REPEAT WW:=MEM[W].HH.RH;FREENODE(W,3);W:=WW;UNTIL W=MEM[P+K].HH.RH;END;
FREENODE(P,10);END;END;{:448}{577:}PROCEDURE RINGDELETE(P:HALFWORD);
VAR Q,R:HALFWORD;BEGIN Q:=MEM[P+1].INT;
IF Q<>0 THEN IF Q<>P THEN BEGIN WHILE MEM[Q+1].INT<>P DO Q:=MEM[Q+1].INT
;MEM[Q+1].INT:=MEM[P+1].INT;END;END;{:577}{761:}
PROCEDURE RECYCLEVALUE(P:HALFWORD);LABEL 30;VAR T:SMALLNUMBER;V:INTEGER;
VV:INTEGER;Q,R,S,PP:HALFWORD;BEGIN T:=MEM[P].HH.B0;
IF T<16 THEN V:=MEM[P+1].INT;CASE T OF 0,1,2,15,18:;
3,5,7,10,12:RINGDELETE(P);
4:BEGIN IF STRREF[V]<127 THEN IF STRREF[V]>1 THEN STRREF[V]:=STRREF[V]-1
ELSE FLUSHSTRING(V);END;
6:IF MEM[V].HH.LH=0 THEN TOSSPEN(V)ELSE MEM[V].HH.LH:=MEM[V].HH.LH-1;
11,8:TOSSKNOTLIST(V);9:TOSSEDGES(V);14,13:{762:}
IF V<>0 THEN BEGIN Q:=V+BIGNODESIZE[T];REPEAT Q:=Q-2;RECYCLEVALUE(Q);
UNTIL Q=V;FREENODE(V,BIGNODESIZE[T]);END{:762};16,17:{763:}
BEGIN Q:=MEM[P+1].HH.RH;WHILE MEM[Q].HH.LH<>0 DO Q:=MEM[Q].HH.RH;
MEM[MEM[P+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[P+1].HH.LH;MEM[Q].HH.RH:=0;
FLUSHNODELIS(MEM[P+1].HH.RH);END{:763};19:{764:}BEGIN MAXC[16]:=0;
MAXC[17]:=0;MAXLINK[16]:=0;MAXLINK[17]:=0;Q:=MEM[13].HH.RH;
WHILE Q<>13 DO BEGIN S:=Q+1;WHILE TRUE DO BEGIN R:=MEM[S].HH.RH;
IF MEM[R].HH.LH=0 THEN GOTO 30;
IF MEM[R].HH.LH<>P THEN S:=R ELSE BEGIN T:=MEM[Q].HH.B0;
MEM[S].HH.RH:=MEM[R].HH.RH;MEM[R].HH.LH:=Q;
IF ABS(MEM[R+1].INT)>MAXC[T]THEN{766:}
BEGIN IF MAXC[T]>0 THEN BEGIN MEM[MAXPTR[T]].HH.RH:=MAXLINK[T];
MAXLINK[T]:=MAXPTR[T];END;MAXC[T]:=ABS(MEM[R+1].INT);MAXPTR[T]:=R;
END{:766}ELSE BEGIN MEM[R].HH.RH:=MAXLINK[T];MAXLINK[T]:=R;END;END;END;
30:Q:=MEM[R].HH.RH;END;IF(MAXC[16]>0)OR(MAXC[17]>0)THEN{767:}
BEGIN IF(MAXC[16]>=268435456)OR(MAXC[16]DIV 4096>=MAXC[17])THEN T:=16
ELSE T:=17;{768:}R:=MAXPTR[T];PP:=MEM[R].HH.LH;V:=MEM[R+1].INT;
IF T=16 THEN MEM[R+1].INT:=-268435456 ELSE MEM[R+1].INT:=-65536;Q:=PP+1;
S:=MEM[Q].HH.RH;WHILE MEM[S].HH.LH>PP DO BEGIN Q:=S;S:=MEM[Q].HH.RH;END;
MEM[Q].HH.RH:=R;MEM[R].HH.RH:=S;
WHILE MEM[S].HH.LH<>0 DO S:=MEM[S].HH.RH;Q:=MEM[S].HH.RH;
MEM[S].HH.RH:=0;S:=MEM[PP+1].HH.RH;MEM[Q+1].HH.LH:=MEM[PP+1].HH.LH;
MEM[MEM[PP+1].HH.LH].HH.RH:=Q;MEM[PP].HH.B0:=19;MEM[PP+1].INT:=0;
IF CUREXP=PP THEN IF CURTYPE=T THEN CURTYPE:=19;
IF INTERNAL[2]>0 THEN{769:}IF INTERESTING(P)THEN BEGIN BEGINDIAGNOS;
PRINTNL(614);IF V>0 THEN PRINTCHAR(45);
IF T=16 THEN VV:=ROUNDFRACTIO(MAXC[16])ELSE VV:=MAXC[17];
IF VV<>65536 THEN PRINTSCALED(VV);PRINTVARIABL(P);
WHILE MEM[P+1].INT>0 DO BEGIN PRINT(436);MEM[P+1].INT:=MEM[P+1].INT-2;
END;IF T=16 THEN PRINTCHAR(61)ELSE PRINT(615);PRINTDEPENDE(S,T);
ENDDIAGNOSTI(FALSE);END{:769}{:768};T:=33-T;
IF MAXC[T]>0 THEN BEGIN MEM[MAXPTR[T]].HH.RH:=MAXLINK[T];
MAXLINK[T]:=MAXPTR[T];END;IF T<>16 THEN{770:}
FOR T:=16 TO 17 DO BEGIN R:=MAXLINK[T];
WHILE R<>0 DO BEGIN Q:=MEM[R].HH.LH;
MEM[Q+1].HH.RH:=PPLUSFQ(MEM[Q+1].HH.RH,MAKEFRACTION(MEM[R+1].INT,-V),S,T
,16);IF MEM[Q+1].HH.RH=DEPFINAL THEN MAKEKNOWN(Q,DEPFINAL);Q:=R;
R:=MEM[R].HH.RH;FREENODE(Q,2);END;END{:770}ELSE{771:}
FOR T:=16 TO 17 DO BEGIN R:=MAXLINK[T];
WHILE R<>0 DO BEGIN Q:=MEM[R].HH.LH;
IF T=16 THEN BEGIN IF CUREXP=Q THEN IF CURTYPE=16 THEN CURTYPE:=17;
MEM[Q+1].HH.RH:=POVERV(MEM[Q+1].HH.RH,65536,16,17);MEM[Q].HH.B0:=17;
MEM[R+1].INT:=ROUNDFRACTIO(MEM[R+1].INT);END;
MEM[Q+1].HH.RH:=PPLUSFQ(MEM[Q+1].HH.RH,MAKESCALED(MEM[R+1].INT,-V),S,17,
17);IF MEM[Q+1].HH.RH=DEPFINAL THEN MAKEKNOWN(Q,DEPFINAL);Q:=R;
R:=MEM[R].HH.RH;FREENODE(Q,2);END;END{:771};FLUSHNODELIS(S);
IF FIXNEEDED THEN FIXDEPENDENC;BEGIN IF ARITHERROR THEN CLEARARITH;END;
END{:767};END{:764};20,21:CONFUSION(613);
22,23:DELETEMACREF(MEM[P+1].INT);END;MEM[P].HH.B0:=0;END;{:761}{760:}
PROCEDURE FLUSHCUREXP(V:SCALED);
BEGIN CASE CURTYPE OF 3,5,7,10,12,13,14,16,17,19:BEGIN RECYCLEVALUE(
CUREXP);FREENODE(CUREXP,2);END;
6:IF MEM[CUREXP].HH.LH=0 THEN TOSSPEN(CUREXP)ELSE MEM[CUREXP].HH.LH:=MEM
[CUREXP].HH.LH-1;
4:BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[CUREXP]>1 THEN STRREF[
CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP);END;
8,11:TOSSKNOTLIST(CUREXP);9:TOSSEDGES(CUREXP);OTHERS:END;CURTYPE:=15;
CUREXP:=V;END;{:760}{772:}PROCEDURE FLUSHERROR(V:SCALED);BEGIN ERROR;
FLUSHCUREXP(V);END;PROCEDURE BACKERROR;FORWARD;PROCEDURE GETXNEXT;
FORWARD;PROCEDURE PUTGETERROR;BEGIN BACKERROR;GETXNEXT;END;
PROCEDURE PUTGETFLUSHE(V:SCALED);BEGIN PUTGETERROR;FLUSHCUREXP(V);END;
{:772}{239:}PROCEDURE FLUSHBELOWVA(P:HALFWORD);VAR Q,R:HALFWORD;
BEGIN IF MEM[P].HH.B0<>21 THEN RECYCLEVALUE(P)ELSE BEGIN Q:=MEM[P+1].HH.
RH;WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;
FREENODE(R,3);END;R:=MEM[P+1].HH.LH;Q:=MEM[R].HH.RH;RECYCLEVALUE(R);
IF MEM[P].HH.B1<=1 THEN FREENODE(R,2)ELSE FREENODE(R,3);
REPEAT FLUSHBELOWVA(Q);R:=Q;Q:=MEM[Q].HH.RH;FREENODE(R,3);UNTIL Q=21;
MEM[P].HH.B0:=0;END;END;{:239}PROCEDURE FLUSHVARIABL(P,T:HALFWORD;
DISCARDSUFFI:BOOLEAN);LABEL 10;VAR Q,R:HALFWORD;N:HALFWORD;
BEGIN WHILE T<>0 DO BEGIN IF MEM[P].HH.B0<>21 THEN GOTO 10;
N:=MEM[T].HH.LH;T:=MEM[T].HH.RH;IF N=0 THEN BEGIN R:=P+1;
Q:=MEM[R].HH.RH;
WHILE MEM[Q].HH.B1=3 DO BEGIN FLUSHVARIABL(Q,T,DISCARDSUFFI);
IF T=0 THEN IF MEM[Q].HH.B0=21 THEN R:=Q ELSE BEGIN MEM[R].HH.RH:=MEM[Q]
.HH.RH;FREENODE(Q,3);END ELSE R:=Q;Q:=MEM[R].HH.RH;END;END;
P:=MEM[P+1].HH.LH;REPEAT R:=P;P:=MEM[P].HH.RH;UNTIL MEM[P+2].HH.LH>=N;
IF MEM[P+2].HH.LH<>N THEN GOTO 10;END;
IF DISCARDSUFFI THEN FLUSHBELOWVA(P)ELSE BEGIN IF MEM[P].HH.B0=21 THEN P
:=MEM[P+1].HH.LH;RECYCLEVALUE(P);END;10:END;{:238}{240:}
FUNCTION UNDTYPE(P:HALFWORD):SMALLNUMBER;
BEGIN CASE MEM[P].HH.B0 OF 0,1:UNDTYPE:=0;2,3:UNDTYPE:=3;4,5:UNDTYPE:=5;
6,7,8:UNDTYPE:=7;9,10:UNDTYPE:=10;11,12:UNDTYPE:=12;
13,14,18:UNDTYPE:=MEM[P].HH.B0;15,16,17,19:UNDTYPE:=18;END;END;{:240}
{241:}PROCEDURE CLEARSYMBOL(P:HALFWORD;SAVING:BOOLEAN);VAR Q:HALFWORD;
BEGIN Q:=EQTB[P].RH;
CASE EQTB[P].LH MOD 82 OF 8,53,43,48:IF NOT SAVING THEN DELETEMACREF(Q);
39:IF Q<>0 THEN IF SAVING THEN MEM[Q].HH.B1:=1 ELSE BEGIN FLUSHBELOWVA(Q
);FREENODE(Q,2);END;OTHERS:END;EQTB[P]:=EQTB[2243];END;{:241}{244:}
PROCEDURE SAVEVARIABLE(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].HH:=EQTB[Q];SAVEPTR:=P;END;
CLEARSYMBOL(Q,(SAVEPTR<>0));END;{:244}{245:}
PROCEDURE SAVEINTERNAL(Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF SAVEPTR<>0 THEN BEGIN P:=GETNODE(2);MEM[P].HH.LH:=2243+Q;
MEM[P].HH.RH:=SAVEPTR;MEM[P+1].INT:=INTERNAL[Q];SAVEPTR:=P;END;END;
{:245}{246:}PROCEDURE UNSAVE;VAR Q:HALFWORD;P:HALFWORD;
BEGIN WHILE MEM[SAVEPTR].HH.LH<>0 DO BEGIN Q:=MEM[SAVEPTR].HH.LH;
IF Q>2243 THEN BEGIN INTERNAL[Q-(2243)]:=MEM[SAVEPTR+1].INT;
END ELSE BEGIN CLEARSYMBOL(Q,FALSE);EQTB[Q]:=MEM[SAVEPTR+1].HH;
IF EQTB[Q].LH MOD 82=39 THEN BEGIN P:=EQTB[Q].RH;
IF P<>0 THEN MEM[P].HH.B1:=0;END;END;P:=MEM[SAVEPTR].HH.RH;
FREENODE(SAVEPTR,2);SAVEPTR:=P;END;P:=MEM[SAVEPTR].HH.RH;
BEGIN MEM[SAVEPTR].HH.RH:=AVAIL;AVAIL:=SAVEPTR;DYNUSED:=DYNUSED-1;END;
SAVEPTR:=P;END;{:246}{256:}FUNCTION COPYKNOT(P:HALFWORD):HALFWORD;
VAR Q:HALFWORD;K:0..6;BEGIN Q:=GETNODE(7);
FOR K:=0 TO 6 DO MEM[Q+K]:=MEM[P+K];COPYKNOT:=Q;END;{:256}{257:}
FUNCTION COPYPATH(P:HALFWORD):HALFWORD;LABEL 10;VAR Q,PP,QQ:HALFWORD;
BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B0:=MEM[PP].HH.B0;
MEM[QQ].HH.B1:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+3].INT:=MEM[PP+3].INT;
MEM[QQ+4].INT:=MEM[PP+4].INT;MEM[QQ+5].INT:=MEM[PP+5].INT;
MEM[QQ+6].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[QQ].HH.RH:=Q;COPYPATH:=Q;GOTO 10;END;
MEM[QQ].HH.RH:=GETNODE(7);QQ:=MEM[QQ].HH.RH;PP:=MEM[PP].HH.RH;END;
10:END;{:257}{258:}FUNCTION HTAPYPOC(P:HALFWORD):HALFWORD;LABEL 10;
VAR Q,PP,QQ,RR:HALFWORD;BEGIN Q:=GETNODE(7);QQ:=Q;PP:=P;
WHILE TRUE DO BEGIN MEM[QQ].HH.B1:=MEM[PP].HH.B0;
MEM[QQ].HH.B0:=MEM[PP].HH.B1;MEM[QQ+1].INT:=MEM[PP+1].INT;
MEM[QQ+2].INT:=MEM[PP+2].INT;MEM[QQ+5].INT:=MEM[PP+3].INT;
MEM[QQ+6].INT:=MEM[PP+4].INT;MEM[QQ+3].INT:=MEM[PP+5].INT;
MEM[QQ+4].INT:=MEM[PP+6].INT;
IF MEM[PP].HH.RH=P THEN BEGIN MEM[Q].HH.RH:=QQ;PATHTAIL:=PP;HTAPYPOC:=Q;
GOTO 10;END;RR:=GETNODE(7);MEM[RR].HH.RH:=QQ;QQ:=RR;PP:=MEM[PP].HH.RH;
END;10:END;{:258}{261:}{276:}{288:}
FUNCTION CURLRATIO(GAMMA,ATENSION,BTENSION:SCALED):FRACTION;
VAR ALPHA,BETA,NUM,DENOM,FF:FRACTION;
BEGIN ALPHA:=MAKEFRACTION(65536,ATENSION);
BETA:=MAKEFRACTION(65536,BTENSION);
IF ALPHA<=BETA THEN BEGIN FF:=MAKEFRACTION(ALPHA,BETA);
FF:=TAKEFRACTION(FF,FF);GAMMA:=TAKEFRACTION(GAMMA,FF);
BETA:=BETA DIV 4096;DENOM:=TAKEFRACTION(GAMMA,ALPHA)+196608-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;
END ELSE BEGIN FF:=MAKEFRACTION(BETA,ALPHA);FF:=TAKEFRACTION(FF,FF);
BETA:=TAKEFRACTION(BETA,FF)DIV 4096;
DENOM:=TAKEFRACTION(GAMMA,ALPHA)+(FF DIV 1365)-BETA;
NUM:=TAKEFRACTION(GAMMA,805306368-ALPHA)+BETA;END;
IF NUM>=DENOM+DENOM+DENOM+DENOM THEN CURLRATIO:=1073741824 ELSE
CURLRATIO:=MAKEFRACTION(NUM,DENOM);END;{:288}{291:}
PROCEDURE SETCONTROLS(P,Q:HALFWORD;K:INTEGER);VAR RR,SS:FRACTION;
LT,RT:SCALED;SINE:FRACTION;BEGIN LT:=MEM[Q+4].INT;
IF LT<>0 THEN RT:=MEM[P+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
RR:=VELOCITY(ST,CT,SF,CF,RT);SS:=VELOCITY(SF,CF,ST,CT,LT);
IF MEM[Q+4].INT=0 THEN{292:}
IF((ST>=0)AND(SF>=0))OR((ST<=0)AND(SF<=0))THEN BEGIN SINE:=TAKEFRACTION(
ABS(ST),CF)+TAKEFRACTION(ABS(SF),CT);
IF SINE>0 THEN BEGIN IF ABVSCD(ABS(SF),268435456,RR,SINE)<0 THEN RR:=
MAKEFRACTION(ABS(SF),SINE);
IF ABVSCD(ABS(ST),268435456,SS,SINE)<0 THEN SS:=MAKEFRACTION(ABS(ST),
SINE);END;END{:292};
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(TAKEFRACTION(DELTAX[K],CT)-
TAKEFRACTION(DELTAY[K],ST),RR);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(TAKEFRACTION(DELTAY[K],CT)+
TAKEFRACTION(DELTAX[K],ST),RR);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(TAKEFRACTION(DELTAX[K],CF)+
TAKEFRACTION(DELTAY[K],SF),SS);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(TAKEFRACTION(DELTAY[K],CF)-
TAKEFRACTION(DELTAX[K],SF),SS);MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;END;
{:291}PROCEDURE SOLVECHOICES(P,Q:HALFWORD;N:HALFWORD);LABEL 40,10;
VAR K:0..PATHSIZE;R,S,T:HALFWORD;SINE,COSINE:FRACTION;{278:}
AA,BB,CC,FF,ACC:FRACTION;DD,EE:SCALED;LT,RT:SCALED;{:278}BEGIN K:=0;
S:=P;WHILE TRUE DO BEGIN T:=MEM[S].HH.RH;IF K=0 THEN{277:}
CASE MEM[S].HH.B1 OF 2:IF MEM[T].HH.B0=2 THEN{293:}
BEGIN COSINE:=MAKEFRACTION(DELTAX[0],DELTA[0]);
SINE:=MAKEFRACTION(DELTAY[0],DELTA[0]);R:=MEM[P+5].INT;
CT:=TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,SINE);
ST:=TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,SINE);
AA:=PYTHADD(ST,CT);CT:=MAKEFRACTION(CT,AA);ST:=MAKEFRACTION(ST,AA);
R:=MEM[Q+3].INT;
CF:=TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,SINE);
SF:=-TAKEFRACTION(MEM[R+2].INT,COSINE)+TAKEFRACTION(MEM[R+1].INT,SINE);
AA:=PYTHADD(SF,CF);CF:=MAKEFRACTION(CF,AA);SF:=MAKEFRACTION(SF,AA);
SETCONTROLS(P,Q,0);GOTO 10;END{:293}ELSE{285:}BEGIN R:=MEM[S+5].INT;
SINE:=MAKEFRACTION(DELTAY[0],DELTA[0]);
COSINE:=MAKEFRACTION(DELTAX[0],DELTA[0]);
VV[0]:=NARG(TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].INT,
SINE),TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,SINE))
;UU[0]:=0;WW[0]:=0;END{:285};3:IF MEM[T].HH.B0=3 THEN{294:}
BEGIN MEM[P].HH.B1:=1;MEM[Q].HH.B0:=1;LT:=MEM[Q+4].INT;
IF LT<>0 THEN RT:=MEM[P+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF RT=65536 THEN BEGIN IF DELTAX[0]>=0 THEN MEM[P+5].INT:=MEM[P+1].INT+(
(DELTAX[0]+1)DIV 3)ELSE MEM[P+5].INT:=MEM[P+1].INT+((DELTAX[0]-1)DIV 3);
IF DELTAY[0]>=0 THEN MEM[P+6].INT:=MEM[P+2].INT+((DELTAY[0]+1)DIV 3)ELSE
MEM[P+6].INT:=MEM[P+2].INT+((DELTAY[0]-1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*RT);
MEM[P+5].INT:=MEM[P+1].INT+TAKEFRACTION(DELTAX[0],FF);
MEM[P+6].INT:=MEM[P+2].INT+TAKEFRACTION(DELTAY[0],FF);END;
IF LT=65536 THEN BEGIN IF DELTAX[0]>=0 THEN MEM[Q+3].INT:=MEM[Q+1].INT-(
(DELTAX[0]+1)DIV 3)ELSE MEM[Q+3].INT:=MEM[Q+1].INT-((DELTAX[0]-1)DIV 3);
IF DELTAY[0]>=0 THEN MEM[Q+4].INT:=MEM[Q+2].INT-((DELTAY[0]+1)DIV 3)ELSE
MEM[Q+4].INT:=MEM[Q+2].INT-((DELTAY[0]-1)DIV 3);
END ELSE BEGIN FF:=MAKEFRACTION(65536,3*LT);
MEM[Q+3].INT:=MEM[Q+1].INT-TAKEFRACTION(DELTAX[0],FF);
MEM[Q+4].INT:=MEM[Q+2].INT-TAKEFRACTION(DELTAY[0],FF);END;GOTO 10;
END{:294}ELSE{286:}BEGIN CC:=MEM[S+5].INT;LT:=MEM[T+4].INT;
IF LT<>0 THEN RT:=MEM[S+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF(RT=65536)AND(LT=65536)THEN UU[0]:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE UU[0]:=CURLRATIO(CC,RT,LT);VV[0]:=-TAKEFRACTION(PSI[1],UU[0]);
WW[0]:=0;END{:286};4:BEGIN UU[0]:=0;VV[0]:=0;WW[0]:=268435456;END;
END{:277}ELSE CASE MEM[S].HH.B0 OF 5,4:{279:}BEGIN{280:}
IF(MEM[R+6].INT=65536)OR(MEM[R+6].INT=0)THEN BEGIN AA:=134217728;
DD:=2*DELTA[K];
END ELSE BEGIN AA:=MAKEFRACTION(65536,3*MEM[R+6].INT-65536);
DD:=TAKEFRACTION(DELTA[K],805306368-MAKEFRACTION(65536,MEM[R+6].INT));
END;IF(MEM[T+4].INT=65536)OR(MEM[T+4].INT=0)THEN BEGIN BB:=134217728;
EE:=2*DELTA[K-1];
END ELSE BEGIN BB:=MAKEFRACTION(65536,3*MEM[T+4].INT-65536);
EE:=TAKEFRACTION(DELTA[K-1],805306368-MAKEFRACTION(65536,MEM[T+4].INT));
END;CC:=268435456-TAKEFRACTION(UU[K-1],AA){:280};{281:}
DD:=TAKEFRACTION(DD,CC);LT:=MEM[S+4].INT;RT:=MEM[S+6].INT;
IF LT=0 THEN LT:=65536;IF RT=0 THEN RT:=65536;
IF LT<>RT THEN IF LT<RT THEN BEGIN FF:=MAKEFRACTION(LT,RT);
FF:=TAKEFRACTION(FF,FF);DD:=TAKEFRACTION(DD,FF);
END ELSE BEGIN FF:=MAKEFRACTION(RT,LT);FF:=TAKEFRACTION(FF,FF);
EE:=TAKEFRACTION(EE,FF);END;FF:=MAKEFRACTION(EE,EE+DD){:281};
UU[K]:=TAKEFRACTION(FF,BB);{282:}ACC:=-TAKEFRACTION(PSI[K+1],UU[K]);
IF MEM[R].HH.B1=3 THEN BEGIN WW[K]:=0;
VV[K]:=ACC-TAKEFRACTION(PSI[1],268435456-FF);
END ELSE BEGIN FF:=MAKEFRACTION(268435456-FF,CC);
ACC:=ACC-TAKEFRACTION(PSI[K],FF);FF:=TAKEFRACTION(FF,AA);
VV[K]:=ACC-TAKEFRACTION(VV[K-1],FF);
IF WW[K-1]=0 THEN WW[K]:=0 ELSE WW[K]:=-TAKEFRACTION(WW[K-1],FF);
END{:282};IF MEM[S].HH.B0=5 THEN{283:}BEGIN AA:=0;BB:=268435456;
REPEAT K:=K-1;IF K=0 THEN K:=N;AA:=VV[K]-TAKEFRACTION(AA,UU[K]);
BB:=WW[K]-TAKEFRACTION(BB,UU[K]);UNTIL K=N;
AA:=MAKEFRACTION(AA,268435456-BB);THETA[N]:=AA;VV[0]:=AA;
FOR K:=1 TO N-1 DO VV[K]:=VV[K]+TAKEFRACTION(AA,WW[K]);GOTO 40;END{:283}
;END{:279};3:{287:}BEGIN CC:=MEM[S+3].INT;LT:=MEM[S+4].INT;
IF LT<>0 THEN RT:=MEM[R+6].INT ELSE BEGIN LT:=65536;RT:=65536;END;
IF(RT=65536)AND(LT=65536)THEN FF:=MAKEFRACTION(CC+CC+65536,CC+131072)
ELSE FF:=CURLRATIO(CC,LT,RT);
THETA[N]:=-MAKEFRACTION(TAKEFRACTION(VV[N-1],FF),268435456-TAKEFRACTION(
FF,UU[N-1]));GOTO 40;END{:287};2:{284:}BEGIN R:=MEM[S+3].INT;
SINE:=MAKEFRACTION(DELTAY[N-1],DELTA[N-1]);
COSINE:=MAKEFRACTION(DELTAX[N-1],DELTA[N-1]);
THETA[N]:=NARG(TAKEFRACTION(MEM[R+1].INT,COSINE)+TAKEFRACTION(MEM[R+2].
INT,SINE),TAKEFRACTION(MEM[R+2].INT,COSINE)-TAKEFRACTION(MEM[R+1].INT,
SINE));GOTO 40;END{:284};END;R:=S;S:=T;K:=K+1;END;40:{289:}
FOR K:=N-1 DOWNTO 0 DO THETA[K]:=VV[K]-TAKEFRACTION(THETA[K+1],UU[K]);
S:=P;K:=0;REPEAT T:=MEM[S].HH.RH;NSINCOS(THETA[K]);ST:=NSIN;CT:=NCOS;
NSINCOS(-PSI[K+1]-THETA[K+1]);SF:=NSIN;CF:=NCOS;SETCONTROLS(S,T,K);
K:=K+1;S:=T;UNTIL K=N{:289};10:END;{:276}
PROCEDURE MAKECHOICES(KNOTS,COORDS:HALFWORD);LABEL 30;VAR H:HALFWORD;
P,Q:HALFWORD;{272:}K,N:0..PATHSIZE;R,S,T:HALFWORD;SINE,COSINE:FRACTION;
{:272}BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[3]>0 THEN PRINTPATH(KNOTS,381);{263:}P:=KNOTS;
REPEAT Q:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[Q+1].INT THEN IF MEM[P+2].INT=MEM[Q+2].INT THEN IF
MEM[P].HH.B1>1 THEN BEGIN MEM[P].HH.B1:=1;
IF MEM[P].HH.B0=4 THEN BEGIN MEM[P].HH.B0:=3;MEM[P+3].INT:=65536;END;
MEM[Q].HH.B0:=1;IF MEM[Q].HH.B1=4 THEN BEGIN MEM[Q].HH.B1:=3;
MEM[P+5].INT:=65536;END;MEM[P+5].INT:=MEM[P+1].INT;
MEM[Q+3].INT:=MEM[P+1].INT;MEM[P+6].INT:=MEM[P+2].INT;
MEM[Q+4].INT:=MEM[P+2].INT;END;P:=Q;UNTIL P=KNOTS{:263};{264:}H:=KNOTS;
WHILE TRUE DO BEGIN IF MEM[H].HH.B0<>4 THEN GOTO 30;
IF MEM[H].HH.B1<>4 THEN GOTO 30;H:=MEM[H].HH.RH;
IF H=KNOTS THEN BEGIN MEM[H].HH.B0:=5;GOTO 30;END;END;30:{:264};P:=H;
REPEAT{265:}Q:=MEM[P].HH.RH;
IF MEM[P].HH.B1>=2 THEN BEGIN WHILE(MEM[Q].HH.B0=4)AND(MEM[Q].HH.B1=4)DO
Q:=MEM[Q].HH.RH;{270:}{273:}K:=0;S:=P;N:=PATHSIZE;
REPEAT T:=MEM[S].HH.RH;DELTAX[K]:=MEM[T+1].INT-MEM[S+1].INT;
DELTAY[K]:=MEM[T+2].INT-MEM[S+2].INT;
DELTA[K]:=PYTHADD(DELTAX[K],DELTAY[K]);
IF K>0 THEN BEGIN SINE:=MAKEFRACTION(DELTAY[K-1],DELTA[K-1]);
COSINE:=MAKEFRACTION(DELTAX[K-1],DELTA[K-1]);
PSI[K]:=NARG(TAKEFRACTION(DELTAX[K],COSINE)+TAKEFRACTION(DELTAY[K],SINE)
,TAKEFRACTION(DELTAY[K],COSINE)-TAKEFRACTION(DELTAX[K],SINE));END;
K:=K+1;S:=T;IF K=PATHSIZE THEN OVERFLOW(386,PATHSIZE);IF S=Q THEN N:=K;
UNTIL(K>=N)AND(MEM[S].HH.B0<>5);
IF K=N THEN PSI[N]:=0 ELSE PSI[K]:=PSI[1]{:273};{274:}
IF MEM[Q].HH.B0=4 THEN BEGIN MEM[21].INT:=MEM[Q+5].INT-MEM[Q+1].INT;
MEM[22].INT:=MEM[Q+6].INT-MEM[Q+2].INT;
IF(MEM[21].INT=0)AND(MEM[22].INT=0)THEN BEGIN MEM[Q].HH.B0:=3;
MEM[Q+3].INT:=65536;END ELSE BEGIN MEM[Q].HH.B0:=2;MEM[Q+3].INT:=20;END;
END;
IF(MEM[P].HH.B1=4)AND(MEM[P].HH.B0=1)THEN BEGIN MEM[15].INT:=MEM[P+1].
INT-MEM[P+3].INT;MEM[16].INT:=MEM[P+2].INT-MEM[P+4].INT;
IF(MEM[15].INT=0)AND(MEM[16].INT=0)THEN BEGIN MEM[P].HH.B1:=3;
MEM[P+5].INT:=65536;END ELSE BEGIN MEM[P].HH.B1:=2;MEM[P+5].INT:=14;
END END{:274};SOLVECHOICES(P,Q,N){:270};END;P:=Q{:265};UNTIL P=H;
IF INTERNAL[3]>0 THEN PRINTPATH(KNOTS,382);
WHILE COORDS<>0 DO BEGIN P:=COORDS;COORDS:=MEM[P].HH.RH;FREENODE(P,3);
END;IF ARITHERROR THEN{262:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(383);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=384;HELPLINE[0]:=385;END;PUTGETERROR;
ARITHERROR:=FALSE;END{:262};END;{:261}{303:}
PROCEDURE MAKEMOVES(XX0,XX1,XX2,XX3,YY0,YY1,YY2,YY3:SCALED;
XICORR,ETACORR:SMALLNUMBER);LABEL 22,30,10;
VAR X1,X2,X3,M,R,Y1,Y2,Y3,N,S,L:INTEGER;Q,T,U,X2A,X3A,Y2A,Y3A:INTEGER;
BEGIN IF(XX3<XX0)OR(YY3<YY0)THEN CONFUSION(109);L:=16;BISECTPTR:=0;
X1:=XX1-XX0;X2:=XX2-XX1;X3:=XX3-XX2;
IF XX0>=XICORR THEN R:=(XX0-XICORR)MOD 65536 ELSE R:=65535-((-XX0+XICORR
-1)MOD 65536);M:=(XX3-XX0+R)DIV 65536;Y1:=YY1-YY0;Y2:=YY2-YY1;
Y3:=YY3-YY2;
IF YY0>=ETACORR THEN S:=(YY0-ETACORR)MOD 65536 ELSE S:=65535-((-YY0+
ETACORR-1)MOD 65536);N:=(YY3-YY0+S)DIV 65536;
IF(XX3-XX0>=268435456)OR(YY3-YY0>=268435456)THEN{305:}
BEGIN X1:=(X1+XICORR)DIV 2;X2:=(X2+XICORR)DIV 2;X3:=(X3+XICORR)DIV 2;
R:=(R+XICORR)DIV 2;Y1:=(Y1+ETACORR)DIV 2;Y2:=(Y2+ETACORR)DIV 2;
Y3:=(Y3+ETACORR)DIV 2;S:=(S+ETACORR)DIV 2;L:=15;END{:305};
WHILE TRUE DO BEGIN 22:{306:}IF M=0 THEN{307:}
WHILE N>0 DO BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;N:=N-1;END{:307}
ELSE IF N=0 THEN{308:}MOVE[MOVEPTR]:=MOVE[MOVEPTR]+M{:308}
ELSE IF M+N=2 THEN{309:}BEGIN R:=TWOTOTHE[L]-R;S:=TWOTOTHE[L]-S;
WHILE L<30 DO BEGIN X3A:=X3;X2A:=(X2+X3+XICORR)DIV 2;
X2:=(X1+X2+XICORR)DIV 2;X3:=(X2+X2A+XICORR)DIV 2;T:=X1+X2+X3;
R:=R+R-XICORR;Y3A:=Y3;Y2A:=(Y2+Y3+ETACORR)DIV 2;
Y2:=(Y1+Y2+ETACORR)DIV 2;Y3:=(Y2+Y2A+ETACORR)DIV 2;U:=Y1+Y2+Y3;
S:=S+S-ETACORR;IF T<R THEN IF U<S THEN{310:}BEGIN X1:=X3;X2:=X2A;
X3:=X3A;R:=R-T;Y1:=Y3;Y2:=Y2A;Y3:=Y3A;S:=S-U;END{:310}ELSE BEGIN{312:}
BEGIN MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=2;END{:312};GOTO 30;
END ELSE IF U<S THEN BEGIN{311:}BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;
MOVEPTR:=MOVEPTR+1;MOVE[MOVEPTR]:=1;END{:311};GOTO 30;END;L:=L+1;END;
R:=R-XICORR;S:=S-ETACORR;
IF ABVSCD(X1+X2+X3-R,S,Y1+Y2+Y3-S,R)-XICORR>=0 THEN{311:}
BEGIN MOVE[MOVEPTR]:=MOVE[MOVEPTR]+1;MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=1;END{:311}ELSE{312:}BEGIN MOVEPTR:=MOVEPTR+1;
MOVE[MOVEPTR]:=2;END{:312};30:END{:309}ELSE BEGIN L:=L+1;
BISECTSTACK[BISECTPTR+10]:=L;BISECTSTACK[BISECTPTR+2]:=X3;
BISECTSTACK[BISECTPTR+1]:=(X2+X3+XICORR)DIV 2;X2:=(X1+X2+XICORR)DIV 2;
X3:=(X2+BISECTSTACK[BISECTPTR+1]+XICORR)DIV 2;
BISECTSTACK[BISECTPTR]:=X3;R:=R+R+XICORR;T:=X1+X2+X3+R;
Q:=T DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+3]:=T MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+4]:=M-Q;M:=Q;BISECTSTACK[BISECTPTR+7]:=Y3;
BISECTSTACK[BISECTPTR+6]:=(Y2+Y3+ETACORR)DIV 2;Y2:=(Y1+Y2+ETACORR)DIV 2;
Y3:=(Y2+BISECTSTACK[BISECTPTR+6]+ETACORR)DIV 2;
BISECTSTACK[BISECTPTR+5]:=Y3;S:=S+S+ETACORR;U:=Y1+Y2+Y3+S;
Q:=U DIV TWOTOTHE[L];BISECTSTACK[BISECTPTR+8]:=U MOD TWOTOTHE[L];
BISECTSTACK[BISECTPTR+9]:=N-Q;N:=Q;BISECTPTR:=BISECTPTR+11;GOTO 22;
END{:306};IF BISECTPTR=0 THEN GOTO 10;{304:}BISECTPTR:=BISECTPTR-11;
X1:=BISECTSTACK[BISECTPTR];X2:=BISECTSTACK[BISECTPTR+1];
X3:=BISECTSTACK[BISECTPTR+2];R:=BISECTSTACK[BISECTPTR+3];
M:=BISECTSTACK[BISECTPTR+4];Y1:=BISECTSTACK[BISECTPTR+5];
Y2:=BISECTSTACK[BISECTPTR+6];Y3:=BISECTSTACK[BISECTPTR+7];
S:=BISECTSTACK[BISECTPTR+8];N:=BISECTSTACK[BISECTPTR+9];
L:=BISECTSTACK[BISECTPTR+10]{:304};END;10:END;{:303}{313:}
PROCEDURE SMOOTHMOVES(B,T:INTEGER);VAR K:1..MOVESIZE;A,AA,AAA:INTEGER;
BEGIN IF T-B>=3 THEN BEGIN K:=B+2;AA:=MOVE[K-1];AAA:=MOVE[K-2];
REPEAT A:=MOVE[K];IF ABS(A-AA)>1 THEN{314:}
IF A>AA THEN BEGIN IF AAA>=AA THEN IF A>=MOVE[K+1]THEN BEGIN MOVE[K-1]:=
MOVE[K-1]+1;MOVE[K]:=A-1;END;
END ELSE BEGIN IF AAA<=AA THEN IF A<=MOVE[K+1]THEN BEGIN MOVE[K-1]:=MOVE
[K-1]-1;MOVE[K]:=A+1;END;END{:314};K:=K+1;AAA:=AA;AA:=A;UNTIL K=T;END;
END;{:313}{318:}PROCEDURE INITEDGES(H:HALFWORD);BEGIN MEM[H].HH.LH:=H;
MEM[H].HH.RH:=H;MEM[H+1].HH.LH:=8191;MEM[H+1].HH.RH:=1;
MEM[H+2].HH.LH:=8191;MEM[H+2].HH.RH:=1;MEM[H+3].HH.LH:=4096;
MEM[H+3].HH.RH:=0;MEM[H+4].INT:=0;MEM[H+5].HH.RH:=H;MEM[H+5].HH.LH:=0;
END;{:318}{320:}PROCEDURE FIXOFFSET;VAR P,Q:HALFWORD;DELTA:INTEGER;
BEGIN DELTA:=8*(MEM[CUREDGES+3].HH.LH-4096);MEM[CUREDGES+3].HH.LH:=4096;
Q:=MEM[CUREDGES].HH.RH;WHILE Q<>CUREDGES DO BEGIN P:=MEM[Q+1].HH.RH;
WHILE P>26000 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;
END;P:=MEM[Q+1].HH.LH;
WHILE P>1 DO BEGIN MEM[P].HH.LH:=MEM[P].HH.LH-DELTA;P:=MEM[P].HH.RH;END;
Q:=MEM[Q].HH.RH;END;END;{:320}{321:}
PROCEDURE EDGEPREP(ML,MR,NL,NR:INTEGER);VAR DELTA:HALFWORD;P,Q:HALFWORD;
BEGIN ML:=ML+4096;MR:=MR+4096;NL:=NL+4096;NR:=NR+4095;
IF ML<MEM[CUREDGES+2].HH.LH THEN MEM[CUREDGES+2].HH.LH:=ML;
IF MR>MEM[CUREDGES+2].HH.RH THEN MEM[CUREDGES+2].HH.RH:=MR;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-8192)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-8192)<4096)THEN
FIXOFFSET;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN BEGIN MEM[CUREDGES+1].HH.LH:=NR+1;
MEM[CUREDGES+1].HH.RH:=NR;END;IF NL<MEM[CUREDGES+1].HH.LH THEN{322:}
BEGIN DELTA:=MEM[CUREDGES+1].HH.LH-NL;MEM[CUREDGES+1].HH.LH:=NL;
P:=MEM[CUREDGES].HH.RH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=26000;
MEM[Q+1].HH.LH:=1;MEM[P].HH.LH:=Q;MEM[Q].HH.RH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.LH:=CUREDGES;MEM[CUREDGES].HH.RH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NL-1;
END{:322};IF NR>MEM[CUREDGES+1].HH.RH THEN{323:}
BEGIN DELTA:=NR-MEM[CUREDGES+1].HH.RH;MEM[CUREDGES+1].HH.RH:=NR;
P:=MEM[CUREDGES].HH.LH;REPEAT Q:=GETNODE(2);MEM[Q+1].HH.RH:=26000;
MEM[Q+1].HH.LH:=1;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;P:=Q;DELTA:=DELTA-1;
UNTIL DELTA=0;MEM[P].HH.RH:=CUREDGES;MEM[CUREDGES].HH.LH:=P;
IF MEM[CUREDGES+5].HH.RH=CUREDGES THEN MEM[CUREDGES+5].HH.LH:=NR+1;
END{:323};END;{:321}{326:}FUNCTION COPYEDGES(H:HALFWORD):HALFWORD;
VAR P,R:HALFWORD;HH,PP,QQ,RR,SS:HALFWORD;BEGIN HH:=GETNODE(6);
MEM[HH+1]:=MEM[H+1];MEM[HH+2]:=MEM[H+2];MEM[HH+3]:=MEM[H+3];
MEM[HH+4]:=MEM[H+4];MEM[HH+5].HH.LH:=MEM[HH+1].HH.RH+1;
MEM[HH+5].HH.RH:=HH;P:=MEM[H].HH.RH;QQ:=HH;
WHILE P<>H DO BEGIN PP:=GETNODE(2);MEM[QQ].HH.RH:=PP;MEM[PP].HH.LH:=QQ;
{327:}R:=MEM[P+1].HH.RH;RR:=PP+1;WHILE R>26000 DO BEGIN SS:=GETAVAIL;
MEM[RR].HH.RH:=SS;RR:=SS;MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;
END;MEM[RR].HH.RH:=26000;R:=MEM[P+1].HH.LH;RR:=26001;
WHILE R>1 DO BEGIN SS:=GETAVAIL;MEM[RR].HH.RH:=SS;RR:=SS;
MEM[RR].HH.LH:=MEM[R].HH.LH;R:=MEM[R].HH.RH;END;MEM[RR].HH.RH:=R;
MEM[PP+1].HH.LH:=MEM[26001].HH.RH{:327};P:=MEM[P].HH.RH;QQ:=PP;END;
MEM[QQ].HH.RH:=HH;MEM[HH].HH.LH:=QQ;COPYEDGES:=HH;END;{:326}{328:}
PROCEDURE YREFLECTEDGE;VAR P,Q,R:HALFWORD;
BEGIN P:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+1].HH.LH:=8191-MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=8191-P;
MEM[CUREDGES+5].HH.LH:=8191-MEM[CUREDGES+5].HH.LH;
P:=MEM[CUREDGES].HH.RH;Q:=CUREDGES;REPEAT R:=MEM[P].HH.RH;
MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=P;Q:=P;P:=R;UNTIL Q=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:328}{329:}PROCEDURE XREFLECTEDGE;
VAR P,Q,R,S:HALFWORD;M:INTEGER;BEGIN P:=MEM[CUREDGES+2].HH.LH;
MEM[CUREDGES+2].HH.LH:=8192-MEM[CUREDGES+2].HH.RH;
MEM[CUREDGES+2].HH.RH:=8192-P;
IF NOT(ABS(MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-8192)<4096)OR NOT
(ABS(MEM[CUREDGES+2].HH.RH+MEM[CUREDGES+3].HH.LH-8192)<4096)THEN
FIXOFFSET;M:=(MEM[CUREDGES+3].HH.LH*8+4)*2;P:=MEM[CUREDGES].HH.RH;
REPEAT{331:}Q:=MEM[P+1].HH.RH;R:=26000;
WHILE Q<>26000 DO BEGIN S:=MEM[Q].HH.RH;MEM[Q].HH.RH:=R;R:=Q;
MEM[R].HH.LH:=M-MEM[Q].HH.LH;Q:=S;END;MEM[P+1].HH.RH:=R{:331};{330:}
Q:=MEM[P+1].HH.LH;WHILE Q>1 DO BEGIN MEM[Q].HH.LH:=M-MEM[Q].HH.LH;
Q:=MEM[Q].HH.RH;END{:330};P:=MEM[P].HH.RH;UNTIL P=CUREDGES;
MEM[CUREDGES+4].INT:=0;END;{:329}{332:}
PROCEDURE NEGATEEDGES(H:HALFWORD);VAR P,Q:HALFWORD;
BEGIN P:=MEM[H].HH.RH;WHILE P<>H DO BEGIN Q:=MEM[P+1].HH.RH;
WHILE Q>26000 DO BEGIN MEM[Q].HH.LH:=8-2*((MEM[Q].HH.LH)MOD 8)+MEM[Q].HH
.LH;Q:=MEM[Q].HH.RH;END;Q:=MEM[P+1].HH.LH;
WHILE Q>1 DO BEGIN MEM[Q].HH.LH:=8-2*((MEM[Q].HH.LH)MOD 8)+MEM[Q].HH.LH;
Q:=MEM[Q].HH.RH;END;P:=MEM[P].HH.RH;END;MEM[H+4].INT:=0;END;{:332}{333:}
PROCEDURE SORTEDGES(H:HALFWORD);LABEL 30;VAR K:HALFWORD;
P,Q,R,S:HALFWORD;BEGIN R:=MEM[H+1].HH.LH;MEM[H+1].HH.LH:=0;
P:=MEM[R].HH.RH;MEM[R].HH.RH:=26000;MEM[26001].HH.RH:=R;
WHILE P>1 DO BEGIN K:=MEM[P].HH.LH;Q:=26001;REPEAT R:=Q;Q:=MEM[R].HH.RH;
UNTIL K<=MEM[Q].HH.LH;MEM[R].HH.RH:=P;R:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;
P:=R;END;{334:}BEGIN R:=H+1;Q:=MEM[R].HH.RH;P:=MEM[26001].HH.RH;
WHILE TRUE DO BEGIN K:=MEM[P].HH.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;
Q:=MEM[R].HH.RH;END;MEM[R].HH.RH:=P;S:=MEM[P].HH.RH;MEM[P].HH.RH:=Q;
IF S=26000 THEN GOTO 30;R:=P;P:=S;END;30:END{:334};END;{:333}{335:}
PROCEDURE CULLEDGES(WPLUS,WMINUS:INTEGER);LABEL 30;VAR P,Q,R,S:HALFWORD;
W:INTEGER;D:INTEGER;M:INTEGER;MM:INTEGER;WW:INTEGER;PREVW:INTEGER;
N,MINN,MAXN:HALFWORD;MIND,MAXD:HALFWORD;BEGIN MIND:=262143;MAXD:=0;
MINN:=262143;MAXN:=0;P:=MEM[CUREDGES].HH.RH;N:=MEM[CUREDGES+1].HH.LH;
WHILE P<>CUREDGES DO BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);
IF MEM[P+1].HH.RH>26000 THEN{336:}BEGIN R:=26001;Q:=MEM[P+1].HH.RH;
WW:=0;M:=1000000;PREVW:=0;
WHILE TRUE DO BEGIN IF Q=26000 THEN MM:=1000000 ELSE BEGIN D:=MEM[Q].HH.
LH;MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;IF MM>M THEN BEGIN{337:}
IF W<>PREVW THEN BEGIN S:=GETAVAIL;MEM[R].HH.RH:=S;
MEM[S].HH.LH:=8*M+4+W-PREVW;R:=S;PREVW:=W;END{:337};
IF Q=26000 THEN GOTO 30;END;M:=MM;
IF(WW>=WPLUS)OR(WW<=WMINUS)THEN W:=1 ELSE W:=0;S:=MEM[Q].HH.RH;
BEGIN MEM[Q].HH.RH:=AVAIL;AVAIL:=Q;DYNUSED:=DYNUSED-1;END;Q:=S;END;
30:MEM[R].HH.RH:=26000;MEM[P+1].HH.RH:=MEM[26001].HH.RH;
IF R<>26001 THEN{338:}BEGIN IF MINN=262143 THEN MINN:=N;MAXN:=N;
IF MIND>MEM[MEM[26001].HH.RH].HH.LH THEN MIND:=MEM[MEM[26001].HH.RH].HH.
LH;IF MAXD<MEM[R].HH.LH THEN MAXD:=MEM[R].HH.LH;END{:338};END{:336};
P:=MEM[P].HH.RH;N:=N+1;END;{339:}IF MINN>MAXN THEN{340:}
BEGIN P:=MEM[CUREDGES].HH.RH;WHILE P<>CUREDGES DO BEGIN Q:=MEM[P].HH.RH;
FREENODE(P,2);P:=Q;END;INITEDGES(CUREDGES);END{:340}
ELSE BEGIN N:=MEM[CUREDGES+1].HH.LH;MEM[CUREDGES+1].HH.LH:=MINN;
WHILE MINN>N DO BEGIN P:=MEM[CUREDGES].HH.RH;
MEM[CUREDGES].HH.RH:=MEM[P].HH.RH;MEM[MEM[P].HH.RH].HH.LH:=CUREDGES;
FREENODE(P,2);N:=N+1;END;N:=MEM[CUREDGES+1].HH.RH;
MEM[CUREDGES+1].HH.RH:=MAXN;MEM[CUREDGES+5].HH.LH:=MAXN+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;
WHILE MAXN<N DO BEGIN P:=MEM[CUREDGES].HH.LH;
MEM[CUREDGES].HH.LH:=MEM[P].HH.LH;MEM[MEM[P].HH.LH].HH.RH:=CUREDGES;
FREENODE(P,2);N:=N-1;END;
MEM[CUREDGES+2].HH.LH:=((MIND)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
MEM[CUREDGES+2].HH.RH:=((MAXD)DIV 8)-MEM[CUREDGES+3].HH.LH+4096;
END{:339};MEM[CUREDGES+4].INT:=0;END;{:335}{341:}PROCEDURE XYSWAPEDGES;
LABEL 30;VAR MMAGIC,NMAGIC:INTEGER;P,Q,R,S:HALFWORD;{344:}
MSPREAD:INTEGER;J,JJ:0..MOVESIZE;M,MM:INTEGER;PD,RD:INTEGER;
PM,RM:INTEGER;W:INTEGER;WW:INTEGER;DW:INTEGER;{:344}{350:}
EXTRAS:INTEGER;XW:-3..3;K:INTEGER;{:350}BEGIN{343:}
MSPREAD:=MEM[CUREDGES+2].HH.RH-MEM[CUREDGES+2].HH.LH;
IF MSPREAD>MOVESIZE THEN OVERFLOW(390,MOVESIZE);
FOR J:=0 TO MSPREAD DO MOVE[J]:=26000{:343};{342:}P:=GETNODE(2);
MEM[P+1].HH.RH:=26000;MEM[P+1].HH.LH:=0;MEM[P].HH.LH:=CUREDGES;
MEM[MEM[CUREDGES].HH.RH].HH.LH:=P;P:=GETNODE(2);MEM[P+1].HH.RH:=26000;
MEM[P].HH.LH:=MEM[CUREDGES].HH.LH;{:342};{352:}
MMAGIC:=MEM[CUREDGES+2].HH.LH+MEM[CUREDGES+3].HH.LH-4096;
NMAGIC:=8*MEM[CUREDGES+1].HH.RH+12{:352};REPEAT Q:=MEM[P].HH.LH;
IF MEM[Q+1].HH.LH>1 THEN SORTEDGES(Q);{345:}R:=MEM[P+1].HH.RH;
FREENODE(P,2);P:=R;PD:=MEM[P].HH.LH;PM:=PD DIV 8;R:=MEM[Q+1].HH.RH;
RD:=MEM[R].HH.LH;RM:=RD DIV 8;W:=0;
WHILE TRUE DO BEGIN IF PM<RM THEN MM:=PM ELSE MM:=RM;IF W<>0 THEN{349:}
IF M<>MM THEN BEGIN IF MM-MMAGIC>=MOVESIZE THEN CONFUSION(365);
EXTRAS:=(ABS(W)-1)DIV 3;
IF EXTRAS>0 THEN BEGIN IF W>0 THEN XW:=+3 ELSE XW:=-3;WW:=W-EXTRAS*XW;
END ELSE WW:=W;REPEAT J:=M-MMAGIC;
FOR K:=1 TO EXTRAS DO BEGIN S:=GETAVAIL;MEM[S].HH.LH:=NMAGIC+XW;
MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;END;S:=GETAVAIL;
MEM[S].HH.LH:=NMAGIC+WW;MEM[S].HH.RH:=MOVE[J];MOVE[J]:=S;M:=M+1;
UNTIL M=MM;END{:349};IF PD<RD THEN BEGIN DW:=(PD MOD 8)-4;{347:}
S:=MEM[P].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;
END;P:=S;PD:=MEM[P].HH.LH;PM:=PD DIV 8{:347};
END ELSE BEGIN IF R=26000 THEN GOTO 30;DW:=-((RD MOD 8)-4);{346:}
R:=MEM[R].HH.RH;RD:=MEM[R].HH.LH;RM:=RD DIV 8{:346};END;M:=MM;W:=W+DW;
END;30:{:345};P:=Q;NMAGIC:=NMAGIC-8;UNTIL MEM[P].HH.LH=CUREDGES;
FREENODE(P,2);{351:}MOVE[MSPREAD]:=0;J:=0;WHILE MOVE[J]=26000 DO J:=J+1;
IF J=MSPREAD THEN INITEDGES(CUREDGES)ELSE BEGIN MM:=MEM[CUREDGES+2].HH.
LH;MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+1].HH.LH;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+3].HH.LH:=4096;JJ:=MSPREAD-1;
WHILE MOVE[JJ]=26000 DO JJ:=JJ-1;MEM[CUREDGES+1].HH.LH:=J+MM;
MEM[CUREDGES+1].HH.RH:=JJ+MM;Q:=CUREDGES;REPEAT P:=GETNODE(2);
MEM[Q].HH.RH:=P;MEM[P].HH.LH:=Q;MEM[P+1].HH.RH:=MOVE[J];
MEM[P+1].HH.LH:=0;J:=J+1;Q:=P;UNTIL J>JJ;MEM[Q].HH.RH:=CUREDGES;
MEM[CUREDGES].HH.LH:=Q;MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+1].HH.RH+1;
MEM[CUREDGES+5].HH.RH:=CUREDGES;MEM[CUREDGES+4].INT:=0;END;{:351};END;
{:341}{353:}PROCEDURE MERGEEDGES(H:HALFWORD);LABEL 30;
VAR P,Q,R,PP,QQ,RR:HALFWORD;N:INTEGER;K:HALFWORD;DELTA:INTEGER;
BEGIN IF MEM[H].HH.RH<>H THEN BEGIN IF(MEM[H+2].HH.LH<MEM[CUREDGES+2].HH
.LH)OR(MEM[H+2].HH.RH>MEM[CUREDGES+2].HH.RH)OR(MEM[H+1].HH.LH<MEM[
CUREDGES+1].HH.LH)OR(MEM[H+1].HH.RH>MEM[CUREDGES+1].HH.RH)THEN EDGEPREP(
MEM[H+2].HH.LH-4096,MEM[H+2].HH.RH-4096,MEM[H+1].HH.LH-4096,MEM[H+1].HH.
RH-4095);IF MEM[H+3].HH.LH<>MEM[CUREDGES+3].HH.LH THEN{354:}
BEGIN PP:=MEM[H].HH.RH;DELTA:=8*(MEM[CUREDGES+3].HH.LH-MEM[H+3].HH.LH);
REPEAT QQ:=MEM[PP+1].HH.RH;
WHILE QQ>26000 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;QQ:=MEM[PP+1].HH.LH;
WHILE QQ>1 DO BEGIN MEM[QQ].HH.LH:=MEM[QQ].HH.LH+DELTA;
QQ:=MEM[QQ].HH.RH;END;PP:=MEM[PP].HH.RH;UNTIL PP=H;END{:354};
N:=MEM[CUREDGES+1].HH.LH;P:=MEM[CUREDGES].HH.RH;PP:=MEM[H].HH.RH;
WHILE N<MEM[H+1].HH.LH DO BEGIN N:=N+1;P:=MEM[P].HH.RH;END;REPEAT{355:}
QQ:=MEM[PP+1].HH.LH;
IF QQ>1 THEN IF MEM[P+1].HH.LH<=1 THEN MEM[P+1].HH.LH:=QQ ELSE BEGIN
WHILE MEM[QQ].HH.RH>1 DO QQ:=MEM[QQ].HH.RH;
MEM[QQ].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=MEM[PP+1].HH.LH;END;
MEM[PP+1].HH.LH:=0;QQ:=MEM[PP+1].HH.RH;
IF QQ<>26000 THEN BEGIN IF MEM[P+1].HH.LH=1 THEN MEM[P+1].HH.LH:=0;
MEM[PP+1].HH.RH:=26000;R:=P+1;Q:=MEM[R].HH.RH;
IF Q=26000 THEN MEM[P+1].HH.RH:=QQ ELSE WHILE TRUE DO BEGIN K:=MEM[QQ].
HH.LH;WHILE K>MEM[Q].HH.LH DO BEGIN R:=Q;Q:=MEM[R].HH.RH;END;
MEM[R].HH.RH:=QQ;RR:=MEM[QQ].HH.RH;MEM[QQ].HH.RH:=Q;
IF RR=26000 THEN GOTO 30;R:=QQ;QQ:=RR;END;END;30:{:355};
PP:=MEM[PP].HH.RH;P:=MEM[P].HH.RH;UNTIL PP=H;END;END;{:353}{356:}
FUNCTION TOTALWEIGHT(H:HALFWORD):INTEGER;VAR P,Q:HALFWORD;N:INTEGER;
M:0..65535;BEGIN N:=0;P:=MEM[H].HH.RH;
WHILE P<>H DO BEGIN Q:=MEM[P+1].HH.RH;WHILE Q>26000 DO{357:}
BEGIN M:=MEM[Q].HH.LH;N:=N-((M MOD 8)-4)*(M DIV 8);Q:=MEM[Q].HH.RH;
END{:357};Q:=MEM[P+1].HH.LH;WHILE Q>1 DO{357:}BEGIN M:=MEM[Q].HH.LH;
N:=N-((M MOD 8)-4)*(M DIV 8);Q:=MEM[Q].HH.RH;END{:357};P:=MEM[P].HH.RH;
END;TOTALWEIGHT:=N;END;{:356}{359:}PROCEDURE BEGINEDGETRA;
BEGIN PRINTDIAGNOS(391,312);PRINT(392);PRINTINT(CURWT);PRINTCHAR(41);
TRACEX:=-4096;END;PROCEDURE TRACEACORNER;
BEGIN IF FILEOFFSET>MAXPRINTLINE-13 THEN PRINTNL(312);PRINTCHAR(40);
PRINTINT(TRACEX);PRINTCHAR(44);PRINTINT(TRACEYY);PRINTCHAR(41);
TRACEY:=TRACEYY;END;PROCEDURE ENDEDGETRACI;
BEGIN IF TRACEX=-4096 THEN PRINTNL(393)ELSE BEGIN TRACEACORNER;
PRINTCHAR(46);END;ENDDIAGNOSTI(TRUE);END;{:359}{360:}
PROCEDURE TRACENEWEDGE(R:HALFWORD;N:INTEGER);VAR D:INTEGER;W:-3..3;
M,N0,N1:INTEGER;BEGIN D:=MEM[R].HH.LH;W:=(D MOD 8)-4;
M:=(D DIV 8)-MEM[CUREDGES+3].HH.LH;IF W=CURWT THEN BEGIN N0:=N+1;N1:=N;
END ELSE BEGIN N0:=N;N1:=N+1;END;
IF M<>TRACEX THEN BEGIN IF TRACEX=-4096 THEN BEGIN PRINTNL(312);
TRACEYY:=N0;END ELSE IF TRACEYY<>N0 THEN PRINTCHAR(63)ELSE TRACEACORNER;
TRACEX:=M;TRACEACORNER;END ELSE BEGIN IF N0<>TRACEYY THEN PRINTCHAR(33);
IF((N0<N1)AND(TRACEY>TRACEYY))OR((N0>N1)AND(TRACEY<TRACEYY))THEN
TRACEACORNER;END;TRACEYY:=N1;END;{:360}{361:}
PROCEDURE LINEEDGES(X0,Y0,X1,Y1:SCALED);LABEL 30,31;
VAR M0,N0,M1,N1:INTEGER;DELX,DELY:SCALED;YT:SCALED;TX:SCALED;
P,R:HALFWORD;BASE:INTEGER;N:INTEGER;BEGIN N0:=ROUNDUNSCALE(Y0);
N1:=ROUNDUNSCALE(Y1);IF N0<>N1 THEN BEGIN M0:=ROUNDUNSCALE(X0);
M1:=ROUNDUNSCALE(X1);DELX:=X1-X0;DELY:=Y1-Y0;YT:=N0*65536-32768;
Y0:=Y0-YT;Y1:=Y1-YT;IF N0<N1 THEN{362:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4-CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N0,N1)ELSE EDGEPREP(M1,M0,N0,N1);{364:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:364};
Y0:=65536-Y0;WHILE TRUE DO BEGIN R:=GETAVAIL;
MEM[R].HH.RH:=MEM[P+1].HH.LH;MEM[P+1].HH.LH:=R;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX-1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0+TX)+BASE;Y1:=Y1-65536;
IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);IF Y1<65536 THEN GOTO 30;
P:=MEM[P].HH.RH;Y0:=Y0+65536;N:=N+1;END;30:END{:362}ELSE{363:}
BEGIN BASE:=8*MEM[CUREDGES+3].HH.LH+4+CURWT;
IF M0<=M1 THEN EDGEPREP(M0,M1,N1,N0)ELSE EDGEPREP(M1,M0,N1,N0);N0:=N0-1;
{364:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:364};
WHILE TRUE DO BEGIN R:=GETAVAIL;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[P+1].HH.LH:=R;TX:=TAKEFRACTION(DELX,MAKEFRACTION(Y0,DELY));
IF ABVSCD(DELX,Y0,DELY,TX)<0 THEN TX:=TX+1;
MEM[R].HH.LH:=8*ROUNDUNSCALE(X0-TX)+BASE;Y1:=Y1+65536;
IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);IF Y1>=0 THEN GOTO 31;
P:=MEM[P].HH.LH;Y0:=Y0+65536;N:=N-1;END;31:END{:363};
MEM[CUREDGES+5].HH.RH:=P;MEM[CUREDGES+5].HH.LH:=N+4096;END;END;{:361}
{365:}PROCEDURE MOVETOEDGES(M0,N0,M1,N1:INTEGER;OCTANT:SMALLNUMBER);
LABEL 60,61,62,63,30;VAR DELTA:0..MOVESIZE;K:0..MOVESIZE;P,R:HALFWORD;
DX:INTEGER;EDGEANDWEIGH:INTEGER;J:INTEGER;N:INTEGER;SUM:INTEGER;
BEGIN DELTA:=N1-N0;SUM:=MOVE[0];
FOR K:=1 TO DELTA DO SUM:=SUM+ABS(MOVE[K]);
IF SUM<>M1-M0 THEN CONFUSION(48);{366:}CASE OCTANT OF 1:BEGIN DX:=8;
EDGEPREP(M0,M1,N0,N1);GOTO 60;END;5:BEGIN DX:=8;EDGEPREP(N0,N1,M0,M1);
GOTO 62;END;6:BEGIN DX:=-8;EDGEPREP(-N1,-N0,M0,M1);N0:=-N0;GOTO 62;END;
2:BEGIN DX:=-8;EDGEPREP(-M1,-M0,N0,N1);M0:=-M0;GOTO 60;END;
4:BEGIN DX:=-8;EDGEPREP(-M1,-M0,-N1,-N0);M0:=-M0;GOTO 61;END;
8:BEGIN DX:=-8;EDGEPREP(-N1,-N0,-M1,-M0);N0:=-N0;GOTO 63;END;
7:BEGIN DX:=8;EDGEPREP(N0,N1,-M1,-M0);GOTO 63;END;3:BEGIN DX:=8;
EDGEPREP(M0,M1,-N1,-N0);GOTO 61;END;END;{:366};60:{367:}{364:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:364};
IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4-CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;K:=K+1;N:=N+1;UNTIL K=DELTA;END;
GOTO 30{:367};61:{368:}N0:=-N0-1;{364:}N:=MEM[CUREDGES+5].HH.LH-4096;
P:=MEM[CUREDGES+5].HH.RH;IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;
P:=MEM[P].HH.RH;UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;
UNTIL N=N0{:364};IF DELTA>0 THEN BEGIN K:=0;
EDGEANDWEIGH:=8*(M0+MEM[CUREDGES+3].HH.LH)+4+CURWT;
REPEAT EDGEANDWEIGH:=EDGEANDWEIGH+DX*MOVE[K];BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;K:=K+1;N:=N-1;UNTIL K=DELTA;END;
GOTO 30{:368};62:{369:}
EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4-CURWT;N0:=M0;K:=0;{364:}
N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:364};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.RH;J:=J-1;N:=N+1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:369};
63:{370:}EDGEANDWEIGH:=8*(N0+MEM[CUREDGES+3].HH.LH)+4+CURWT;N0:=-M0-1;
K:=0;{364:}N:=MEM[CUREDGES+5].HH.LH-4096;P:=MEM[CUREDGES+5].HH.RH;
IF N<>N0 THEN IF N<N0 THEN REPEAT N:=N+1;P:=MEM[P].HH.RH;
UNTIL N=N0 ELSE REPEAT N:=N-1;P:=MEM[P].HH.LH;UNTIL N=N0{:364};
REPEAT J:=MOVE[K];WHILE J>0 DO BEGIN BEGIN R:=AVAIL;
IF R=0 THEN R:=GETAVAIL ELSE BEGIN AVAIL:=MEM[R].HH.RH;MEM[R].HH.RH:=0;
DYNUSED:=DYNUSED+1;END;END;MEM[R].HH.RH:=MEM[P+1].HH.LH;
MEM[R].HH.LH:=EDGEANDWEIGH;IF INTERNAL[8]>0 THEN TRACENEWEDGE(R,N);
MEM[P+1].HH.LH:=R;P:=MEM[P].HH.LH;J:=J-1;N:=N-1;END;
EDGEANDWEIGH:=EDGEANDWEIGH+DX;K:=K+1;UNTIL K>DELTA;GOTO 30{:370};
30:MEM[CUREDGES+5].HH.LH:=N+4096;MEM[CUREDGES+5].HH.RH:=P;END;{:365}
{373:}PROCEDURE ROTATE(X,Y:SCALED;OCTANT:SMALLNUMBER);
BEGIN CASE OCTANT OF 1:BEGIN CURX:=X;CURY:=Y;END;5:BEGIN CURX:=Y;
CURY:=X;END;6:BEGIN CURX:=Y;CURY:=-X;END;2:BEGIN CURX:=-X;CURY:=Y;END;
4:BEGIN CURX:=-X;CURY:=-Y;END;8:BEGIN CURX:=-Y;CURY:=-X;END;
7:BEGIN CURX:=-Y;CURY:=X;END;3:BEGIN CURX:=X;CURY:=-Y;END;END;END;{:373}
{376:}FUNCTION CROSSINGPOIN(A,B,C:INTEGER):FRACTION;LABEL 10;
VAR D:INTEGER;X,XX,X0,X1,X2:INTEGER;
BEGIN IF A<0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
IF C>=0 THEN BEGIN IF B>=0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;IF A=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
END ELSE IF A=0 THEN IF B<=0 THEN BEGIN CROSSINGPOIN:=0;GOTO 10;END;
{377:}D:=1;X0:=A;X1:=A-B;X2:=B-C;REPEAT X0:=X0+X0;X:=(X1+X2)DIV 2;
IF X1>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN XX:=X1+X;
IF XX>X0 THEN BEGIN X2:=X;D:=D+D;END ELSE BEGIN X0:=X0-XX;
IF X<=X0 THEN IF X+X2<=X0 THEN BEGIN CROSSINGPOIN:=268435457;GOTO 10;
END;X1:=X;D:=D+D+1;END;END;UNTIL D>=268435456;
CROSSINGPOIN:=D-268435456{:377};10:END;{:376}{379:}
PROCEDURE PRINTSPEC(H:HALFWORD;S:STRNUMBER);LABEL 45,30;
VAR P,Q:HALFWORD;OCTANT:SMALLNUMBER;BEGIN PRINTDIAGNOS(394,S);P:=H;
OCTANT:=MEM[P+3].INT;PRINTLN;UNROTATE(MEM[H+1].INT,MEM[H+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(395);WHILE TRUE DO BEGIN{380:}
CASE OCTANT OF 1:PRINT(398);5:PRINT(399);6:PRINT(400);2:PRINT(401);
4:PRINT(402);8:PRINT(403);7:PRINT(404);3:PRINT(405);END;PRINT(406){:380}
;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;IF MEM[P].HH.B1=0 THEN GOTO 45;
{381:}BEGIN PRINTNL(407);UNROTATE(MEM[P+5].INT,MEM[P+6].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(377);
UNROTATE(MEM[Q+3].INT,MEM[Q+4].INT,OCTANT);PRINTTWO(CURX,CURY);
PRINTNL(374);UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,OCTANT);
PRINTTWO(CURX,CURY);PRINT(408);PRINTINT(MEM[Q].HH.B0-1);END{:381};P:=Q;
END;45:IF Q=H THEN GOTO 30;P:=Q;OCTANT:=MEM[P+3].INT;PRINTNL(396);END;
30:PRINTNL(397);ENDDIAGNOSTI(TRUE);END;{:379}{382:}{385:}{389:}
PROCEDURE SPLITCUBIC(P:HALFWORD;T:FRACTION);VAR V:SCALED;Q,R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(7);MEM[P].HH.RH:=R;MEM[R].HH.RH:=Q;
UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
ROTATE(CURX,CURY,MEM[P].HH.B1);MEM[R].HH.B0:=MEM[Q].HH.B0;
MEM[R].HH.B1:=MEM[P].HH.B1;
V:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-MEM[Q+3].INT,T);
MEM[P+5].INT:=MEM[P+1].INT-TAKEFRACTION(MEM[P+1].INT-MEM[P+5].INT,T);
MEM[Q+3].INT:=MEM[Q+3].INT-TAKEFRACTION(MEM[Q+3].INT-CURX,T);
MEM[R+3].INT:=MEM[P+5].INT-TAKEFRACTION(MEM[P+5].INT-V,T);
MEM[R+5].INT:=V-TAKEFRACTION(V-MEM[Q+3].INT,T);
MEM[R+1].INT:=MEM[R+3].INT-TAKEFRACTION(MEM[R+3].INT-MEM[R+5].INT,T);
V:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-MEM[Q+4].INT,T);
MEM[P+6].INT:=MEM[P+2].INT-TAKEFRACTION(MEM[P+2].INT-MEM[P+6].INT,T);
MEM[Q+4].INT:=MEM[Q+4].INT-TAKEFRACTION(MEM[Q+4].INT-CURY,T);
MEM[R+4].INT:=MEM[P+6].INT-TAKEFRACTION(MEM[P+6].INT-V,T);
MEM[R+6].INT:=V-TAKEFRACTION(V-MEM[Q+4].INT,T);
MEM[R+2].INT:=MEM[R+4].INT-TAKEFRACTION(MEM[R+4].INT-MEM[R+6].INT,T);
END;{:389}PROCEDURE SUBDIVIDE(H:HALFWORD);VAR P,Q,R,S,PP,QQ:HALFWORD;
XH:SCALED;DEL1,DEL2,DEL3,DEL,DMAX:SCALED;T:FRACTION;DESTX,DESTY:SCALED;
BEGIN P:=H;XH:=MEM[H+1].INT;REPEAT Q:=MEM[P].HH.RH;{386:}
IF Q=H THEN DESTX:=XH ELSE DESTX:=MEM[Q+1].INT;
DEL1:=MEM[P+5].INT-MEM[P+1].INT;DEL2:=MEM[Q+3].INT-MEM[P+5].INT;
DEL3:=DESTX-MEM[Q+3].INT;{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{388:}
BEGIN MEM[P+1].INT:=-MEM[P+1].INT;MEM[P+5].INT:=-MEM[P+5].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTX:=-DESTX;MEM[P].HH.B1:=2;END{:388};T:=CROSSINGPOIN(DEL1,DEL2,DEL3);
IF T<268435456 THEN{390:}BEGIN SPLITCUBIC(P,T);R:=MEM[P].HH.RH;
IF MEM[R].HH.B1>1 THEN MEM[R].HH.B1:=1 ELSE MEM[R].HH.B1:=2;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT;
MEM[R+3].INT:=MEM[R+1].INT;MEM[R+1].INT:=-MEM[R+1].INT;
MEM[R+5].INT:=MEM[R+1].INT;MEM[Q+3].INT:=-MEM[Q+3].INT;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{391:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;
IF MEM[S+1].INT<-DESTX THEN MEM[S+1].INT:=-DESTX;
IF MEM[S+1].INT<MEM[R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
MEM[S].HH.B1:=MEM[P].HH.B1;MEM[S+3].INT:=MEM[S+1].INT;
MEM[S+1].INT:=-MEM[S+1].INT;MEM[S+5].INT:=MEM[S+1].INT;
MEM[Q+3].INT:=-MEM[Q+3].INT;END{:391}
ELSE IF MEM[R+1].INT>-DESTX THEN MEM[R+1].INT:=-DESTX;END{:390};
END{:386};{392:}PP:=P;REPEAT QQ:=MEM[PP].HH.RH;
UNROTATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1);
ROTATE(CURX,CURY,MEM[PP].HH.B1);DESTX:=CURX;DESTY:=CURY;
DEL1:=MEM[PP+6].INT-MEM[PP+2].INT;DEL2:=MEM[QQ+4].INT-MEM[PP+6].INT;
DEL3:=DESTY-MEM[QQ+4].INT;{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{393:}
BEGIN MEM[PP+2].INT:=-MEM[PP+2].INT;MEM[PP+6].INT:=-MEM[PP+6].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;DEL1:=-DEL1;DEL2:=-DEL2;DEL3:=-DEL3;
DESTY:=-DESTY;MEM[PP].HH.B1:=MEM[PP].HH.B1+2;END{:393};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{394:}
BEGIN SPLITCUBIC(PP,T);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>2 THEN MEM[R].HH.B1:=MEM[R].HH.B1-2 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+2;
IF MEM[R+1].INT>DESTX THEN MEM[R+1].INT:=DESTX ELSE IF MEM[R+1].INT<MEM[
PP+1].INT THEN MEM[R+1].INT:=MEM[PP+1].INT;
IF MEM[R+2].INT<MEM[PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
MEM[R+4].INT:=MEM[R+2].INT;MEM[R+2].INT:=-MEM[R+2].INT;
MEM[R+6].INT:=MEM[R+2].INT;MEM[QQ+4].INT:=-MEM[QQ+4].INT;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{395:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;
IF MEM[S+1].INT>DESTX THEN MEM[S+1].INT:=DESTX ELSE IF MEM[S+1].INT<MEM[
R+1].INT THEN MEM[S+1].INT:=MEM[R+1].INT;
IF MEM[S+2].INT<-DESTY THEN MEM[S+2].INT:=-DESTY;
IF MEM[S+2].INT<MEM[R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
MEM[S].HH.B1:=MEM[PP].HH.B1;MEM[S+4].INT:=MEM[S+2].INT;
MEM[S+2].INT:=-MEM[S+2].INT;MEM[S+6].INT:=MEM[S+2].INT;
MEM[QQ+4].INT:=-MEM[QQ+4].INT;END{:395}
ELSE IF MEM[R+2].INT>-DESTY THEN MEM[R+2].INT:=-DESTY;END{:394};END;
PP:=QQ;UNTIL PP=Q{:392};{396:}PP:=P;REPEAT QQ:=MEM[PP].HH.RH;{397:}
UNROTATE(MEM[QQ+1].INT,MEM[QQ+2].INT,MEM[QQ].HH.B1);
ROTATE(CURX,CURY,MEM[PP].HH.B1);DESTX:=CURX;DESTY:=CURY;
DEL1:=MEM[PP+5].INT-MEM[PP+6].INT;DEL2:=MEM[QQ+3].INT-MEM[QQ+4].INT;
DEL3:=DESTX-DESTY-DEL2;DEL2:=DEL2-DEL1;
DEL1:=DEL1-(MEM[PP+1].INT-MEM[PP+2].INT){:397};{387:}
IF DEL1<>0 THEN DEL:=DEL1 ELSE IF DEL2<>0 THEN DEL:=DEL2 ELSE DEL:=DEL3;
IF DEL<>0 THEN BEGIN DMAX:=ABS(DEL1);
IF ABS(DEL2)>DMAX THEN DMAX:=ABS(DEL2);
IF ABS(DEL3)>DMAX THEN DMAX:=ABS(DEL3);
WHILE DMAX<134217728 DO BEGIN DMAX:=DMAX+DMAX;DEL1:=DEL1+DEL1;
DEL2:=DEL2+DEL2;DEL3:=DEL3+DEL3;END;END{:387};
IF DEL<>0 THEN BEGIN IF DEL<0 THEN{398:}BEGIN DEL:=MEM[PP+2].INT;
MEM[PP+2].INT:=MEM[PP+1].INT;MEM[PP+1].INT:=DEL;DEL:=MEM[PP+6].INT;
MEM[PP+6].INT:=MEM[PP+5].INT;MEM[PP+5].INT:=DEL;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;DEL1:=-DEL1;DEL2:=-DEL2;
DEL3:=-DEL3;DEL:=DESTX;DESTX:=DESTY;DESTY:=DEL;
MEM[PP].HH.B1:=MEM[PP].HH.B1+4;END{:398};
T:=CROSSINGPOIN(DEL1,DEL2,DEL3);IF T<268435456 THEN{399:}
BEGIN SPLITCUBIC(PP,T);R:=MEM[PP].HH.RH;
IF MEM[R].HH.B1>4 THEN MEM[R].HH.B1:=MEM[R].HH.B1-4 ELSE MEM[R].HH.B1:=
MEM[R].HH.B1+4;
IF MEM[R+2].INT>DESTY THEN MEM[R+2].INT:=DESTY ELSE IF MEM[R+2].INT<MEM[
PP+2].INT THEN MEM[R+2].INT:=MEM[PP+2].INT;
IF MEM[R+1].INT-MEM[R+2].INT<MEM[PP+1].INT-MEM[PP+2].INT THEN MEM[R+1].
INT:=MEM[PP+1].INT-MEM[PP+2].INT+MEM[R+2].INT;
MEM[R+4].INT:=MEM[R+2].INT-(MEM[R+1].INT-MEM[R+3].INT);
DEL:=MEM[R+2].INT;MEM[R+2].INT:=MEM[R+1].INT;MEM[R+1].INT:=DEL;
MEM[R+6].INT:=MEM[R+5].INT;
MEM[R+5].INT:=MEM[R+1].INT+MEM[R+6].INT-MEM[R+2].INT;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;
DEL2:=DEL2-TAKEFRACTION(DEL2-DEL3,T);IF DEL2>0 THEN DEL2:=0;
T:=CROSSINGPOIN(0,-DEL2,-DEL3);IF T<268435456 THEN{400:}
BEGIN SPLITCUBIC(R,T);S:=MEM[R].HH.RH;MEM[S].HH.B1:=MEM[PP].HH.B1;
IF MEM[S+2].INT>DESTX THEN MEM[S+2].INT:=DESTX ELSE IF MEM[S+2].INT<MEM[
R+2].INT THEN MEM[S+2].INT:=MEM[R+2].INT;
IF MEM[S+1].INT-MEM[S+2].INT<DESTY-DESTX THEN MEM[S+1].INT:=MEM[S+2].INT
+DESTY-DESTX;
IF MEM[S+1].INT-MEM[S+2].INT<MEM[R+1].INT-MEM[R+2].INT THEN MEM[S+1].INT
:=MEM[R+1].INT-MEM[R+2].INT+MEM[S+2].INT;
MEM[S+4].INT:=MEM[S+2].INT-(MEM[S+1].INT-MEM[S+3].INT);
DEL:=MEM[S+2].INT;MEM[S+2].INT:=MEM[S+1].INT;MEM[S+1].INT:=DEL;
MEM[S+6].INT:=MEM[S+5].INT;
MEM[S+5].INT:=MEM[S+1].INT+MEM[S+6].INT-MEM[S+2].INT;DEL:=MEM[QQ+4].INT;
MEM[QQ+4].INT:=MEM[QQ+3].INT;MEM[QQ+3].INT:=DEL;END{:400}
ELSE IF MEM[R+2].INT-MEM[R+1].INT<DESTX-DESTY THEN MEM[R+2].INT:=DESTX-
DESTY+MEM[R+1].INT;END{:399};END;PP:=QQ;UNTIL PP=Q{:396};P:=Q;UNTIL P=H;
END;{:385}{402:}PROCEDURE REMOVECUBIC(P:HALFWORD);VAR Q:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=MEM[Q].HH.B1;
MEM[P].HH.RH:=MEM[Q].HH.RH;MEM[P+1].INT:=MEM[Q+1].INT;
MEM[P+2].INT:=MEM[Q+2].INT;MEM[P+5].INT:=MEM[Q+5].INT;
MEM[P+6].INT:=MEM[Q+6].INT;FREENODE(Q,7);END;{:402}{406:}
PROCEDURE NEWBOUNDARY(P:HALFWORD;OCTANT:SMALLNUMBER);VAR Q,R:HALFWORD;
BEGIN Q:=MEM[P].HH.RH;R:=GETNODE(7);MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;
MEM[R].HH.B0:=MEM[Q].HH.B0;MEM[R+3].INT:=MEM[Q+3].INT;
MEM[R+4].INT:=MEM[Q+4].INT;MEM[R].HH.B1:=0;MEM[Q].HH.B0:=0;
MEM[R+5].INT:=OCTANT;MEM[Q+3].INT:=MEM[Q].HH.B1;
UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1);
ROTATE(CURX,CURY,OCTANT);MEM[R+1].INT:=CURX;MEM[R+2].INT:=CURY;END;
{:406}FUNCTION MAKESPEC(H:HALFWORD;SAFETYMARGIN:SCALED):HALFWORD;
LABEL 22,30;VAR P,Q,R,S:HALFWORD;K:INTEGER;CHOPPED:BOOLEAN;
MAXALLOWED:SCALED;{408:}O1,O2:SMALLNUMBER;CLOCKWISE:BOOLEAN;
TURNAROUND:BOOLEAN;DX1,DY1,DX2,DY2:INTEGER;DMAX,DEL:INTEGER;{:408}
BEGIN IF INTERNAL[4]>0 THEN PRINTPATH(H,409);
MAXALLOWED:=268402687-SAFETYMARGIN;{384:}P:=H;K:=1;CHOPPED:=FALSE;
REPEAT IF ABS(MEM[P+3].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+3].INT>0 THEN MEM[P+3].INT:=MAXALLOWED ELSE MEM[P+3].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+4].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+4].INT>0 THEN MEM[P+4].INT:=MAXALLOWED ELSE MEM[P+4].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+1].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+1].INT>0 THEN MEM[P+1].INT:=MAXALLOWED ELSE MEM[P+1].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+2].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+2].INT>0 THEN MEM[P+2].INT:=MAXALLOWED ELSE MEM[P+2].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+5].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+5].INT>0 THEN MEM[P+5].INT:=MAXALLOWED ELSE MEM[P+5].INT:=-
MAXALLOWED;END;IF ABS(MEM[P+6].INT)>MAXALLOWED THEN BEGIN CHOPPED:=TRUE;
IF MEM[P+6].INT>0 THEN MEM[P+6].INT:=MAXALLOWED ELSE MEM[P+6].INT:=-
MAXALLOWED;END;P:=MEM[P].HH.RH;MEM[P].HH.B0:=K;K:=K+1;UNTIL P=H;
IF CHOPPED THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(411);END;BEGIN HELPPTR:=4;HELPLINE[3]:=412;
HELPLINE[2]:=413;HELPLINE[1]:=414;HELPLINE[0]:=415;END;PUTGETERROR;
END{:384};SUBDIVIDE(H);{401:}P:=H;REPEAT 22:Q:=MEM[P].HH.RH;
IF(P<>H)OR(Q<>H)THEN BEGIN IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2]
.INT=MEM[P+6].INT THEN IF MEM[P+1].INT=MEM[Q+3].INT THEN IF MEM[P+2].INT
=MEM[Q+4].INT THEN BEGIN UNROTATE(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q].HH.B1
);ROTATE(CURX,CURY,MEM[P].HH.B1);
IF MEM[P+1].INT=CURX THEN IF MEM[P+2].INT=CURY THEN BEGIN REMOVECUBIC(P)
;IF Q<>H THEN GOTO 22 ELSE BEGIN H:=P;Q:=P;END;END;END;END;P:=Q;
UNTIL P=H;{:401};{405:}WINDINGNUMBE:=0;P:=H;Q:=MEM[P].HH.RH;
REPEAT R:=MEM[Q].HH.RH;IF(MEM[P].HH.B1<>MEM[Q].HH.B1)OR(Q=R)THEN{407:}
BEGIN NEWBOUNDARY(P,MEM[P].HH.B1);S:=MEM[P].HH.RH;TURNAROUND:=FALSE;
O1:=OCTANTNUMBER[MEM[P].HH.B1];O2:=OCTANTNUMBER[MEM[Q].HH.B1];
CASE O2-O1 OF 1,-7,7,-1:GOTO 30;0,2,-6:CLOCKWISE:=FALSE;
3,-5,4,-4,5,-3:{409:}BEGIN{410:}DX1:=MEM[S+1].INT-MEM[S+3].INT;
DY1:=MEM[S+2].INT-MEM[S+4].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+5].INT;
DY1:=MEM[S+2].INT-MEM[P+6].INT;
IF DX1=0 THEN IF DY1=0 THEN BEGIN DX1:=MEM[S+1].INT-MEM[P+1].INT;
DY1:=MEM[S+2].INT-MEM[P+2].INT;END;END;DMAX:=ABS(DX1);
IF ABS(DY1)>DMAX THEN DMAX:=ABS(DY1);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX1:=DX1+DX1;DY1:=DY1+DY1;
END;DX2:=MEM[Q+5].INT-MEM[Q+1].INT;DY2:=MEM[Q+6].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN DX2:=MEM[R+3].INT-MEM[Q+1].INT;
DY2:=MEM[R+4].INT-MEM[Q+2].INT;
IF DX2=0 THEN IF DY2=0 THEN BEGIN UNROTATE(MEM[R+1].INT,MEM[R+2].INT,MEM
[R].HH.B1);ROTATE(CURX,CURY,MEM[Q].HH.B1);DX2:=CURX-MEM[Q+1].INT;
DY2:=CURY-MEM[Q+2].INT;END;END;DMAX:=ABS(DX2);
IF ABS(DY2)>DMAX THEN DMAX:=ABS(DY2);
WHILE DMAX<268435456 DO BEGIN DMAX:=DMAX+DMAX;DX2:=DX2+DX2;DY2:=DY2+DY2;
END{:410};UNROTATE(DX1,DY1,MEM[P].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX1:=MAKEFRACTION(CURX,DEL);DY1:=MAKEFRACTION(CURY,DEL);
UNROTATE(DX2,DY2,MEM[Q].HH.B1);DEL:=PYTHADD(CURX,CURY);
DX2:=MAKEFRACTION(CURX,DEL);DY2:=MAKEFRACTION(CURY,DEL);
DEL:=TAKEFRACTION(DX1,DY2)-TAKEFRACTION(DX2,DY1);
IF DEL>4684844 THEN CLOCKWISE:=FALSE ELSE IF DEL<-4684844 THEN CLOCKWISE
:=TRUE ELSE BEGIN CLOCKWISE:=FALSE;TURNAROUND:=TRUE;END;END{:409};
6,-2:CLOCKWISE:=TRUE;END;{411:}
WHILE TRUE DO BEGIN IF CLOCKWISE THEN IF O1=1 THEN O1:=8 ELSE O1:=O1-1
ELSE IF O1=8 THEN O1:=1 ELSE O1:=O1+1;IF O1=O2 THEN GOTO 30;
NEWBOUNDARY(S,OCTANTCODE[O1]);S:=MEM[S].HH.RH;
MEM[S+3].INT:=MEM[S+5].INT;END{:411};
30:IF Q=R THEN BEGIN Q:=MEM[Q].HH.RH;R:=Q;P:=S;MEM[S].HH.RH:=Q;
MEM[Q+3].INT:=MEM[Q+5].INT;MEM[Q].HH.B0:=0;FREENODE(H,7);H:=Q;END;{412:}
P:=MEM[P].HH.RH;REPEAT S:=MEM[P].HH.RH;O1:=OCTANTNUMBER[MEM[P+5].INT];
O2:=OCTANTNUMBER[MEM[S+3].INT];
IF ABS(O1-O2)=1 THEN BEGIN WINDINGNUMBE:=WINDINGNUMBE+O2-O1;
IF O2<O1 THEN O2:=O1;
IF ODD(O2)THEN MEM[P+6].INT:=0 ELSE MEM[P+6].INT:=2;
END ELSE BEGIN IF O1=8 THEN WINDINGNUMBE:=WINDINGNUMBE+1 ELSE
WINDINGNUMBE:=WINDINGNUMBE-1;MEM[P+6].INT:=0;END;
MEM[S+4].INT:=MEM[P+6].INT;{413:}
BEGIN IF MEM[P].HH.B0<>0 THEN IF TURNAROUND OR((MEM[P+6].INT=0)AND(ABS(
MEM[P+4].INT-MEM[P+2].INT)>655))OR((MEM[P+6].INT=2)AND(ABS(MEM[P+3].INT-
MEM[P+4].INT-MEM[P+1].INT+MEM[P+2].INT)>655))THEN MEM[P+6].INT:=MEM[P+6]
.INT+1;
IF MEM[S].HH.B1<>0 THEN IF TURNAROUND OR((MEM[S+4].INT=0)AND(ABS(MEM[S+6
].INT-MEM[S+2].INT)>655))OR((MEM[S+4].INT=2)AND(ABS(MEM[S+5].INT-MEM[S+6
].INT-MEM[S+1].INT+MEM[S+2].INT)>655))THEN MEM[S+4].INT:=MEM[S+4].INT+1;
END{:413};P:=S;UNTIL P=Q{:412};END{:407};P:=Q;Q:=R;UNTIL P=H;{:405};
WHILE MEM[H].HH.B0<>0 DO H:=MEM[H].HH.RH;
IF INTERNAL[4]>0 THEN PRINTSPEC(H,410);MAKESPEC:=H;END;{:382}{418:}
FUNCTION SKEW(P,Q:HALFWORD;XX0,YY0,XX1,YY1:SCALED):BOOLEAN;
VAR LAMBDA,MU:FRACTION;REASONABLE:BOOLEAN;
LAMBDANUM,LAMBDADENOM,MUNUM,MUDENOM,ALPHA,BETA:SCALED;BEGIN{419:}
MUNUM:=YY1-YY0;MUDENOM:=MEM[Q+2].INT-MEM[P+2].INT;LAMBDANUM:=XX1-XX0;
LAMBDADENOM:=MEM[Q+1].INT-MEM[P+1].INT-MUDENOM;
IF(LAMBDANUM<0)OR(MUNUM<0)OR((LAMBDANUM)DIV 2>=LAMBDADENOM)OR((MUNUM)DIV
2>=MUDENOM)THEN BEGIN LAMBDA:=268435456;MU:=268435456;ALPHA:=0;
BETA:=32768;REASONABLE:=FALSE;XX0:=MEM[P+1].INT-MEM[P+2].INT;
YY0:=MEM[P+2].INT+32768;
END ELSE BEGIN LAMBDA:=MAKEFRACTION(LAMBDANUM,LAMBDADENOM);
MU:=MAKEFRACTION(MUNUM,MUDENOM);
ALPHA:=XX0-TAKEFRACTION(MEM[P+1].INT-MEM[P+2].INT,LAMBDA);
BETA:=YY0-TAKEFRACTION(MEM[P+2].INT,MU);REASONABLE:=TRUE;END;{:419};
MEM[P+1].INT:=XX0;MEM[P+2].INT:=YY0;
WHILE P<>Q DO BEGIN MEM[P+5].INT:=TAKEFRACTION(MEM[P+5].INT-MEM[P+6].INT
,LAMBDA)+ALPHA;MEM[P+6].INT:=TAKEFRACTION(MEM[P+6].INT,MU)+BETA;
P:=MEM[P].HH.RH;
MEM[P+3].INT:=TAKEFRACTION(MEM[P+3].INT-MEM[P+4].INT,LAMBDA)+ALPHA;
MEM[P+4].INT:=TAKEFRACTION(MEM[P+4].INT,MU)+BETA;
MEM[P+1].INT:=TAKEFRACTION(MEM[P+1].INT-MEM[P+2].INT,LAMBDA)+ALPHA;
MEM[P+2].INT:=TAKEFRACTION(MEM[P+2].INT,MU)+BETA;END;SKEW:=REASONABLE;
END;{:418}{420:}PROCEDURE MAKEGOOD(X,Y:SCALED;TRANSITION:SMALLNUMBER;
INCOMING:BOOLEAN);VAR THETA,PHI,AVE:SCALED;XX,YY:SCALED;
BEGIN XX:=X+32768-XCORR[OCTANT];CURM:=FLOORUNSCALE(XX);CURX:=CURM*65536;
THETA:=XX-CURX;YY:=Y+32768-YCORR[OCTANT];CURN:=FLOORUNSCALE(YY);
CURY:=CURN*65536;PHI:=YY-CURY;
IF THETA>=PHI+GOOD1[OCTANT]THEN CURDD:=1 ELSE CURDD:=0;
IF TRANSITION=0 THEN BEGIN CURX:=X;
IF INTERNAL[30]>0 THEN IF THETA>=GOOD2[OCTANT]THEN CURD:=1 ELSE CURD:=0
ELSE BEGIN CURY:=Y;CURD:=CURDD;END;
END ELSE IF ODD(TRANSITION)OR(INTERNAL[30]<=65536)THEN BEGIN CURX:=X;
CURY:=Y;CURD:=CURDD;END ELSE{421:}
BEGIN AVE:=(THETA+PHI+GOOD3[OCTANT])DIV 2;
IF AVE<16385 THEN AVE:=16385 ELSE IF AVE>49151 THEN AVE:=49151;
IF INCOMING THEN PHI:=PHI+1;IF THETA<PHI THEN BEGIN THETA:=AVE-49152;
PHI:=AVE-16384;CURD:=0;END ELSE BEGIN THETA:=AVE-16384;PHI:=AVE-49152;
CURD:=1;END;CURX:=CURX+THETA;CURY:=CURY+PHI;END{:421};END;{:420}{424:}
PROCEDURE FILLSPEC(H:HALFWORD);VAR P,Q,R,S:HALFWORD;XX0,YY0:SCALED;
BEGIN IF INTERNAL[8]>0 THEN BEGINEDGETRA;P:=H;
REPEAT OCTANT:=MEM[P+3].INT;{426:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:426};IF Q<>P THEN BEGIN{427:}
MAKEGOOD(MEM[P+1].INT,MEM[P+2].INT,MEM[P+4].INT,TRUE);M0:=CURM;N0:=CURN;
D0:=CURD;DD0:=CURDD;XX0:=CURX-CURY;YY0:=CURY+32768;
MAKEGOOD(MEM[Q+1].INT,MEM[Q+2].INT,MEM[Q+6].INT,FALSE);M1:=CURM;
N1:=CURN;
IF SKEW(P,Q,XX0,YY0,CURX-CURY,CURY+32768)THEN D1:=CURD ELSE BEGIN D1:=
CURDD;D0:=DD0;END{:427};{428:}
IF N1-N0>=MOVESIZE THEN OVERFLOW(390,MOVESIZE);MOVE[0]:=D0;MOVEPTR:=0;
R:=P;REPEAT S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT,MEM[R+5].INT,MEM[S+3].INT,MEM[S+1].INT,MEM[R+2].
INT,MEM[R+6].INT,MEM[S+4].INT,MEM[S+2].INT,XYCORR[OCTANT],YCORR[OCTANT])
;R:=S;UNTIL R=Q;MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(0,MOVEPTR){:428};
MOVETOEDGES(M0,N0,M1,N1,OCTANT);END;P:=MEM[Q].HH.RH;UNTIL P=H;
TOSSKNOTLIST(H);IF INTERNAL[8]>0 THEN ENDEDGETRACI;END;{:424}{436:}
PROCEDURE DUPOFFSET(W:HALFWORD);VAR R:HALFWORD;BEGIN R:=GETNODE(3);
MEM[R+1].INT:=MEM[W+1].INT;MEM[R+2].INT:=MEM[W+2].INT;
MEM[R].HH.RH:=MEM[W].HH.RH;MEM[MEM[W].HH.RH].HH.LH:=R;MEM[R].HH.LH:=W;
MEM[W].HH.RH:=R;END;{:436}{437:}FUNCTION MAKEPEN(H:HALFWORD):HALFWORD;
LABEL 30,31,45,40;VAR O,OO,K:SMALLNUMBER;P:HALFWORD;Q,R,S,W,HH:HALFWORD;
N:INTEGER;DX,DY:SCALED;MC:SCALED;BEGIN{439:}Q:=H;R:=MEM[Q].HH.RH;
MC:=ABS(MEM[H+1].INT);IF Q=R THEN BEGIN HH:=H;MEM[H].HH.B1:=0;
IF MC<ABS(MEM[H+2].INT)THEN MC:=ABS(MEM[H+2].INT);END ELSE BEGIN O:=0;
HH:=0;WHILE TRUE DO BEGIN S:=MEM[R].HH.RH;
IF MC<ABS(MEM[R+1].INT)THEN MC:=ABS(MEM[R+1].INT);
IF MC<ABS(MEM[R+2].INT)THEN MC:=ABS(MEM[R+2].INT);
DX:=MEM[R+1].INT-MEM[Q+1].INT;DY:=MEM[R+2].INT-MEM[Q+2].INT;
IF DX=0 THEN IF DY=0 THEN GOTO 45;
IF ABVSCD(DX,MEM[S+2].INT-MEM[R+2].INT,DY,MEM[S+1].INT-MEM[R+1].INT)<0
THEN GOTO 45;{440:}
IF DX>0 THEN OCTANT:=1 ELSE IF DX=0 THEN IF DY>0 THEN OCTANT:=1 ELSE
OCTANT:=2 ELSE BEGIN DX:=-DX;OCTANT:=2;END;IF DY<0 THEN BEGIN DY:=-DY;
OCTANT:=OCTANT+2;END ELSE IF DY=0 THEN IF OCTANT>1 THEN OCTANT:=4;
IF DX<DY THEN OCTANT:=OCTANT+4{:440};MEM[Q].HH.B1:=OCTANT;
OO:=OCTANTNUMBER[OCTANT];IF O>OO THEN BEGIN IF HH<>0 THEN GOTO 45;HH:=Q;
END;O:=OO;IF(Q=H)AND(HH<>0)THEN GOTO 30;Q:=R;R:=S;END;30:END{:439};
IF MC>=268402688 THEN GOTO 45;P:=GETNODE(10);Q:=HH;MEM[P+9].INT:=MC;
MEM[P].HH.LH:=0;FOR K:=1 TO 8 DO{441:}BEGIN OCTANT:=OCTANTCODE[K];N:=0;
H:=P+OCTANT;WHILE TRUE DO BEGIN R:=GETNODE(3);{442:}
CASE OCTANT OF 1:BEGIN MEM[R+1].INT:=MEM[Q+1].INT-(MEM[Q+2].INT);
MEM[R+2].INT:=MEM[Q+2].INT;END;
5:BEGIN MEM[R+1].INT:=MEM[Q+2].INT-(MEM[Q+1].INT);
MEM[R+2].INT:=MEM[Q+1].INT;END;
6:BEGIN MEM[R+1].INT:=MEM[Q+2].INT-(-MEM[Q+1].INT);
MEM[R+2].INT:=-MEM[Q+1].INT;END;
2:BEGIN MEM[R+1].INT:=-MEM[Q+1].INT-(MEM[Q+2].INT);
MEM[R+2].INT:=MEM[Q+2].INT;END;
4:BEGIN MEM[R+1].INT:=-MEM[Q+1].INT-(-MEM[Q+2].INT);
MEM[R+2].INT:=-MEM[Q+2].INT;END;
8:BEGIN MEM[R+1].INT:=-MEM[Q+2].INT-(-MEM[Q+1].INT);
MEM[R+2].INT:=-MEM[Q+1].INT;END;
7:BEGIN MEM[R+1].INT:=-MEM[Q+2].INT-(MEM[Q+1].INT);
MEM[R+2].INT:=MEM[Q+1].INT;END;
3:BEGIN MEM[R+1].INT:=MEM[Q+1].INT-(-MEM[Q+2].INT);
MEM[R+2].INT:=-MEM[Q+2].INT;END;END{:442};
IF N=0 THEN MEM[H].HH.RH:=R ELSE{443:}
IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;MEM[R].HH.LH:=W;
END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;END{:443};W:=R;
IF MEM[Q].HH.B1<>OCTANT THEN GOTO 31;Q:=MEM[Q].HH.RH;N:=N+1;END;
31:{444:}R:=MEM[H].HH.RH;IF ODD(K)THEN BEGIN MEM[W].HH.RH:=R;
MEM[R].HH.LH:=W;END ELSE BEGIN MEM[W].HH.LH:=R;MEM[R].HH.RH:=W;
MEM[H].HH.RH:=W;R:=W;END;
IF(MEM[R+2].INT<>MEM[MEM[R].HH.RH+2].INT)OR(N=0)THEN BEGIN DUPOFFSET(R);
N:=N+1;END;R:=MEM[R].HH.LH;
IF MEM[R+1].INT<>MEM[MEM[R].HH.LH+1].INT THEN DUPOFFSET(R)ELSE N:=N-1{:
444};MEM[H].HH.LH:=N;END{:441};GOTO 40;45:P:=3;{438:}
IF MC>=268402688 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(420);END;BEGIN HELPPTR:=2;HELPLINE[1]:=421;
HELPLINE[0]:=422;END;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(423);END;BEGIN HELPPTR:=3;HELPLINE[2]:=424;HELPLINE[1]:=425;
HELPLINE[0]:=422;END;END;PUTGETERROR{:438};
40:IF INTERNAL[5]>0 THEN PRINTPEN(P,419);MAKEPEN:=P;END;{:437}{445:}
{447:}FUNCTION TRIVIALKNOT(X,Y:SCALED):HALFWORD;VAR P:HALFWORD;
BEGIN P:=GETNODE(7);MEM[P].HH.B0:=1;MEM[P].HH.B1:=1;MEM[P+1].INT:=X;
MEM[P+3].INT:=X;MEM[P+5].INT:=X;MEM[P+2].INT:=Y;MEM[P+4].INT:=Y;
MEM[P+6].INT:=Y;TRIVIALKNOT:=P;END;{:447}
FUNCTION MAKEPATH(PENHEAD:HALFWORD):HALFWORD;VAR P:HALFWORD;K:1..8;
H:HALFWORD;M,N:INTEGER;W,WW:HALFWORD;BEGIN P:=26001;
FOR K:=1 TO 8 DO BEGIN OCTANT:=OCTANTCODE[K];H:=PENHEAD+OCTANT;
N:=MEM[H].HH.LH;W:=MEM[H].HH.RH;IF NOT ODD(K)THEN W:=MEM[W].HH.LH;
FOR M:=1 TO N+1 DO BEGIN IF ODD(K)THEN WW:=MEM[W].HH.RH ELSE WW:=MEM[W].
HH.LH;
IF(MEM[WW+1].INT<>MEM[W+1].INT)OR(MEM[WW+2].INT<>MEM[W+2].INT)THEN{446:}
BEGIN UNROTATE(MEM[WW+1].INT+MEM[WW+2].INT,MEM[WW+2].INT,OCTANT);
MEM[P].HH.RH:=TRIVIALKNOT(CURX,CURY);P:=MEM[P].HH.RH;END{:446};W:=WW;
END;END;IF P=26001 THEN BEGIN W:=MEM[PENHEAD+1].HH.RH;
P:=TRIVIALKNOT(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT);
MEM[26001].HH.RH:=P;END;MEM[P].HH.RH:=MEM[26001].HH.RH;
MAKEPATH:=MEM[26001].HH.RH;END;{:445}{449:}
PROCEDURE FINDOFFSET(X,Y:SCALED;P:HALFWORD);LABEL 30,10;VAR OCTANT:1..8;
S:-1..+1;N:INTEGER;H,W,WW:HALFWORD;BEGIN{450:}
IF X>0 THEN OCTANT:=1 ELSE IF X=0 THEN IF Y<=0 THEN IF Y=0 THEN BEGIN
CURX:=0;CURY:=0;GOTO 10;
END ELSE OCTANT:=2 ELSE OCTANT:=1 ELSE BEGIN X:=-X;
IF Y=0 THEN OCTANT:=4 ELSE OCTANT:=2;END;
IF Y<0 THEN BEGIN OCTANT:=OCTANT+2;Y:=-Y;END;
IF X>=Y THEN X:=X-Y ELSE BEGIN OCTANT:=OCTANT+4;X:=Y-X;Y:=Y-X;END{:450};
IF ODD(OCTANTNUMBER[OCTANT])THEN S:=-1 ELSE S:=+1;H:=P+OCTANT;
W:=MEM[MEM[H].HH.RH].HH.RH;WW:=MEM[W].HH.RH;N:=MEM[H].HH.LH;
WHILE N>1 DO BEGIN IF ABVSCD(X,MEM[WW+2].INT-MEM[W+2].INT,Y,MEM[WW+1].
INT-MEM[W+1].INT)<>S THEN GOTO 30;W:=WW;WW:=MEM[W].HH.RH;N:=N-1;END;
30:UNROTATE(MEM[W+1].INT+MEM[W+2].INT,MEM[W+2].INT,OCTANT);10:END;{:449}
{452:}{454:}PROCEDURE SPLITFOROFFS(P:HALFWORD;T:FRACTION);
VAR Q:HALFWORD;R:HALFWORD;S:QUARTERWORD;BEGIN Q:=MEM[P].HH.RH;
S:=MEM[Q].HH.B1;MEM[Q].HH.B1:=1;MEM[P].HH.B1:=1;SPLITCUBIC(P,T);
MEM[Q].HH.B1:=S;R:=MEM[P].HH.RH;
IF MEM[R+2].INT<MEM[P+2].INT THEN MEM[R+2].INT:=MEM[P+2].INT ELSE IF MEM
[R+2].INT>MEM[Q+2].INT THEN MEM[R+2].INT:=MEM[Q+2].INT;
IF MEM[R+1].INT<MEM[P+1].INT THEN MEM[R+1].INT:=MEM[P+1].INT ELSE IF MEM
[R+1].INT>MEM[Q+1].INT THEN MEM[R+1].INT:=MEM[Q+1].INT;END;{:454}{458:}
PROCEDURE FINOFFSETPRE(P:HALFWORD;K:HALFWORD;W:HALFWORD;
X0,X1,X2,Y0,Y1,Y2:INTEGER;RISING:BOOLEAN;N:INTEGER);LABEL 10;
VAR Q,WW:HALFWORD;DU,DV:SCALED;T0,T1,T2:INTEGER;T:FRACTION;S:FRACTION;
V:INTEGER;BEGIN WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;MEM[P].HH.B1:=K;
IF RISING THEN IF K=N THEN GOTO 10 ELSE WW:=MEM[W].HH.RH ELSE IF K=1
THEN GOTO 10 ELSE WW:=MEM[W].HH.LH;{459:}DU:=MEM[WW+1].INT-MEM[W+1].INT;
DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:459};T:=CROSSINGPOIN(T0,T1,T2);
IF T>=268435456 THEN GOTO 10;{460:}BEGIN SPLITFOROFFS(P,T);
MEM[P].HH.B1:=K;P:=MEM[P].HH.RH;V:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X0:=V-TAKEFRACTION(V-X1,T);
V:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y0:=V-TAKEFRACTION(V-Y1,T);T1:=T1-TAKEFRACTION(T1-T2,T);
IF T1>0 THEN T1:=0;T:=CROSSINGPOIN(0,-T1,-T2);
IF T<268435456 THEN BEGIN SPLITFOROFFS(P,T);MEM[MEM[P].HH.RH].HH.B1:=K;
V:=X1-TAKEFRACTION(X1-X2,T);X1:=X0-TAKEFRACTION(X0-X1,T);
X2:=X1-TAKEFRACTION(X1-V,T);V:=Y1-TAKEFRACTION(Y1-Y2,T);
Y1:=Y0-TAKEFRACTION(Y0-Y1,T);Y2:=Y1-TAKEFRACTION(Y1-V,T);END;END{:460};
IF RISING THEN K:=K+1 ELSE K:=K-1;W:=WW;END;10:END;{:458}
PROCEDURE OFFSETPREP(C,H:HALFWORD);LABEL 30,45;VAR N:HALFWORD;
P,Q,R,LH,WW:HALFWORD;K:HALFWORD;W:HALFWORD;{456:}
X0,X1,X2,Y0,Y1,Y2:INTEGER;T0,T1,T2:INTEGER;DU,DV,DX,DY:INTEGER;
MAXCOEF:INTEGER;X0A,X1A,X2A,Y0A,Y1A,Y2A:INTEGER;T:FRACTION;S:FRACTION;
{:456}BEGIN P:=C;N:=MEM[H].HH.LH;LH:=MEM[H].HH.RH;
WHILE MEM[P].HH.B1<>0 DO BEGIN Q:=MEM[P].HH.RH;{455:}
IF N<=1 THEN MEM[P].HH.B1:=1 ELSE BEGIN{457:}
X0:=MEM[P+5].INT-MEM[P+1].INT;X2:=MEM[Q+1].INT-MEM[Q+3].INT;
X1:=MEM[Q+3].INT-MEM[P+5].INT;Y0:=MEM[P+6].INT-MEM[P+2].INT;
Y2:=MEM[Q+2].INT-MEM[Q+4].INT;Y1:=MEM[Q+4].INT-MEM[P+6].INT;
MAXCOEF:=ABS(X0);IF ABS(X1)>MAXCOEF THEN MAXCOEF:=ABS(X1);
IF ABS(X2)>MAXCOEF THEN MAXCOEF:=ABS(X2);
IF ABS(Y0)>MAXCOEF THEN MAXCOEF:=ABS(Y0);
IF ABS(Y1)>MAXCOEF THEN MAXCOEF:=ABS(Y1);
IF ABS(Y2)>MAXCOEF THEN MAXCOEF:=ABS(Y2);IF MAXCOEF=0 THEN GOTO 45;
WHILE MAXCOEF<268435456 DO BEGIN MAXCOEF:=MAXCOEF+MAXCOEF;X0:=X0+X0;
X1:=X1+X1;X2:=X2+X2;Y0:=Y0+Y0;Y1:=Y1+Y1;Y2:=Y2+Y2;END;{:457};{462:}
DX:=X0;DY:=Y0;IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X1;DY:=Y1;
IF DX=0 THEN IF DY=0 THEN BEGIN DX:=X2;DY:=Y2;END;END{:462};
IF DX=0 THEN{466:}
FINOFFSETPRE(P,N,MEM[MEM[LH].HH.LH].HH.LH,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,
N){:466}ELSE BEGIN{463:}K:=1;W:=MEM[LH].HH.RH;
WHILE TRUE DO BEGIN IF K=N THEN GOTO 30;WW:=MEM[W].HH.RH;
IF ABVSCD(DY,ABS(MEM[WW+1].INT-MEM[W+1].INT),DX,ABS(MEM[WW+2].INT-MEM[W
+2].INT))>=0 THEN BEGIN K:=K+1;W:=WW;END ELSE GOTO 30;END;30:{:463};
{464:}IF K=1 THEN T:=268435457 ELSE BEGIN WW:=MEM[W].HH.LH;{459:}
DU:=MEM[WW+1].INT-MEM[W+1].INT;DV:=MEM[WW+2].INT-MEM[W+2].INT;
IF ABS(DU)>=ABS(DV)THEN BEGIN S:=MAKEFRACTION(DV,DU);
T0:=TAKEFRACTION(X0,S)-Y0;T1:=TAKEFRACTION(X1,S)-Y1;
T2:=TAKEFRACTION(X2,S)-Y2;END ELSE BEGIN S:=MAKEFRACTION(DU,DV);
T0:=X0-TAKEFRACTION(Y0,S);T1:=X1-TAKEFRACTION(Y1,S);
T2:=X2-TAKEFRACTION(Y2,S);END{:459};T:=CROSSINGPOIN(-T0,-T1,-T2);END;
IF T>=268435456 THEN FINOFFSETPRE(P,K,W,X0,X1,X2,Y0,Y1,Y2,TRUE,N)ELSE
BEGIN SPLITFOROFFS(P,T);R:=MEM[P].HH.RH;X1A:=X0-TAKEFRACTION(X0-X1,T);
X1:=X1-TAKEFRACTION(X1-X2,T);X2A:=X1A-TAKEFRACTION(X1A-X1,T);
Y1A:=Y0-TAKEFRACTION(Y0-Y1,T);Y1:=Y1-TAKEFRACTION(Y1-Y2,T);
Y2A:=Y1A-TAKEFRACTION(Y1A-Y1,T);
FINOFFSETPRE(P,K,W,X0,X1A,X2A,Y0,Y1A,Y2A,TRUE,N);X0:=X2A;Y0:=Y2A;
T1:=T1-TAKEFRACTION(T1-T2,T);IF T1<0 THEN T1:=0;
T:=CROSSINGPOIN(0,T1,T2);IF T<268435456 THEN{465:}
BEGIN SPLITFOROFFS(R,T);X1A:=X1-TAKEFRACTION(X1-X2,T);
X1:=X0-TAKEFRACTION(X0-X1,T);X0A:=X1-TAKEFRACTION(X1-X1A,T);
Y1A:=Y1-TAKEFRACTION(Y1-Y2,T);Y1:=Y0-TAKEFRACTION(Y0-Y1,T);
Y0A:=Y1-TAKEFRACTION(Y1-Y1A,T);
FINOFFSETPRE(MEM[R].HH.RH,K,W,X0A,X1A,X2,Y0A,Y1A,Y2,TRUE,N);X2:=X0A;
Y2:=Y0A;END{:465};
FINOFFSETPRE(R,K-1,WW,-X0,-X1,-X2,-Y0,-Y1,-Y2,FALSE,N);END{:464};END;
45:END{:455};{453:}REPEAT R:=MEM[P].HH.RH;
IF MEM[P+1].INT=MEM[P+5].INT THEN IF MEM[P+2].INT=MEM[P+6].INT THEN IF
MEM[P+1].INT=MEM[R+3].INT THEN IF MEM[P+2].INT=MEM[R+4].INT THEN IF MEM[
P+1].INT=MEM[R+1].INT THEN IF MEM[P+2].INT=MEM[R+2].INT THEN BEGIN
REMOVECUBIC(P);IF R=Q THEN Q:=P;R:=P;END;P:=R;UNTIL P=Q{:453};END;END;
{:452}{467:}{473:}PROCEDURE SKEWLINEEDGE(X0,Y0,X1,Y1:SCALED);
BEGIN UNROTATE(X0+Y0-32768,Y0-32768,OCTANT);X0:=CURX;Y0:=CURY;
UNROTATE(X1+Y1-32768,Y1-32768,OCTANT);
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(432);PRINTTWO(X0,Y0);PRINT(430);
PRINTTWO(CURX,CURY);PRINTNL(312);END;LINEEDGES(X0,Y0,CURX,CURY);END;
{:473}{479:}PROCEDURE DUALMOVES(H,P,Q:HALFWORD);LABEL 30,31;
VAR R,S:HALFWORD;XX,YY,XP,YP,DELX,DELY,TX,TY:SCALED;{470:}
XX0,YY0,XX1,YY1:SCALED;MM0,NN0,MM1,NN1:INTEGER;M,N:INTEGER;K:INTEGER;
W,WW:HALFWORD;SMOOTHBOT,SMOOTHTOP:0..MOVESIZE;{:470}BEGIN{480:}
K:=MEM[H].HH.LH+1;WW:=MEM[H].HH.RH;W:=MEM[WW].HH.LH;
XX0:=MEM[P+1].INT+MEM[W+1].INT;YY0:=MEM[P+2].INT+MEM[W+2].INT;
IF MEM[P+4].INT<2 THEN{474:}
BEGIN SKEWLINEEDGE(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT
,XX0,YY0);YY:=YY0-32768;XX:=XX0+YY;M0:=ROUNDUNSCALE(XX-XCORR[OCTANT]);
N0:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M0*65536>=YY-N0*65536+XYCORR[OCTANT]THEN D0:=1 ELSE D0:=0;
END{:474};XX1:=MEM[Q+1].INT+MEM[WW+1].INT;
YY1:=MEM[Q+2].INT+MEM[WW+2].INT;NN0:=FLOORUNSCALE(YY0-YCORR[OCTANT]);
NN1:=FLOORUNSCALE(YY1-YCORR[OCTANT]);
IF NN1-NN0>=MOVESIZE THEN OVERFLOW(390,MOVESIZE);
MM0:=FLOORUNSCALE(XX0-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(XX1-XYCORR[OCTANT]);
FOR N:=1 TO NN1-NN0+1 DO ENVMOVE[N]:=MM1;ENVMOVE[0]:=MM0;MOVEPTR:=0;
M:=MM0{:480};R:=P;WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{482:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT;
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(433);PRINTINT(K);PRINT(434);
UNROTATE(XX+YY-32768,YY-32768,OCTANT);PRINTTWO(CURX,CURY);END;
IF MEM[R].HH.B1<K THEN BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;
IF YP<>YY THEN{483:}BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;
YY:=YY-TY;TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);TY:=TY-65536;MOVEPTR:=MOVEPTR+1;
IF TY<65536 THEN GOTO 31;YY:=YY+65536;END;
31:IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END;END{:483};
END ELSE BEGIN K:=K+1;W:=MEM[W].HH.RH;XP:=MEM[R+1].INT+MEM[W+1].INT;
YP:=MEM[R+2].INT+MEM[W+2].INT;END;
IF INTERNAL[8]>65536 THEN BEGIN PRINT(430);
UNROTATE(XP+YP-32768,YP-32768,OCTANT);PRINTTWO(CURX,CURY);PRINTNL(312);
END;M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-NN0;
IF M<ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:482};
IF R=P THEN SMOOTHBOT:=MOVEPTR;IF R=Q THEN GOTO 30;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT,MEM
[R+6].INT+MEM[W+2].INT,MEM[S+4].INT+MEM[W+2].INT,MEM[S+2].INT+MEM[W+2].
INT,XYCORR[OCTANT],YCORR[OCTANT]);{481:}
REPEAT IF M<ENVMOVE[N]THEN ENVMOVE[N]:=M;M:=M+MOVE[N]-1;N:=N+1;
UNTIL N>MOVEPTR{:481};R:=S;END;30:{484:}
IF MEM[Q+6].INT>=2 THEN BEGIN YY:=YY1-32768;XX:=XX1+YY;
M1:=ROUNDUNSCALE(XX-XCORR[OCTANT]);N1:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M1*65536>=YY-N1*65536+XYCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;
IF(M<>MM1)OR(MOVEPTR<>NN1-NN0)THEN CONFUSION(50);
MOVE[0]:=D0+ENVMOVE[1]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N+1]-ENVMOVE[N]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1,OCTANT);
IF MEM[Q+6].INT>=2 THEN BEGIN WW:=MEM[MEM[H].HH.RH].HH.LH;
SKEWLINEEDGE(XX1,YY1,MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].
INT);END{:484};END;{:479}
PROCEDURE FILLENVELOPE(SPECHEAD,PENHEAD:HALFWORD);LABEL 30,31;
VAR P,Q,R,S:HALFWORD;H:HALFWORD;XX,YY,XP,YP,DELX,DELY,TX,TY:SCALED;
{470:}XX0,YY0,XX1,YY1:SCALED;MM0,NN0,MM1,NN1:INTEGER;M,N:INTEGER;
K:INTEGER;W,WW:HALFWORD;SMOOTHBOT,SMOOTHTOP:0..MOVESIZE;{:470}
BEGIN IF INTERNAL[8]>0 THEN BEGINEDGETRA;P:=SPECHEAD;
REPEAT OCTANT:=MEM[P+3].INT;H:=PENHEAD+OCTANT;{426:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:426};{468:}X0:=MEM[P+1].INT;
Y0:=MEM[P+2].INT;X1:=MEM[Q+1].INT;Y1:=MEM[Q+2].INT;W:=MEM[H].HH.RH;
IF MEM[P+4].INT>=2 THEN W:=MEM[W].HH.LH;
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(426);
PRINTINT(OCTANTNUMBER[OCTANT]);PRINT(427);PRINTINT(MEM[H].HH.LH);
PRINT(428);IF MEM[H].HH.LH<>1 THEN PRINTCHAR(115);
UNROTATE(X0+MEM[W+1].INT+MEM[W+2].INT,Y0+MEM[W+2].INT,OCTANT);
PRINT(429);PRINTTWO(CURX,CURY);WW:=W;END;
MAKEGOOD(X0+MEM[W+1].INT+MEM[W+2].INT,Y0+MEM[W+2].INT,MEM[P+4].INT,TRUE)
;M0:=CURM;N0:=CURN;D0:=CURD;DD0:=CURDD;XX:=(CURX-CURY)-MEM[W+1].INT;
YY:=CURY+32768-MEM[W+2].INT;W:=MEM[H].HH.RH;
IF MEM[Q+6].INT>=2 THEN W:=MEM[W].HH.LH;
IF INTERNAL[8]>65536 THEN BEGIN PRINT(430);
UNROTATE(X1+MEM[W+1].INT+MEM[W+2].INT,Y1+MEM[W+2].INT,OCTANT);
PRINTTWO(CURX,CURY);END;
MAKEGOOD(X1+MEM[W+1].INT+MEM[W+2].INT,Y1+MEM[W+2].INT,MEM[Q+6].INT,FALSE
);M1:=CURM;N1:=CURN;
IF SKEW(P,Q,XX,YY,CURX-CURY-MEM[W+1].INT,CURY+32768-MEM[W+2].INT)THEN
BEGIN D1:=CURD;
IF INTERNAL[8]>65536 THEN IF INTERNAL[30]>0 THEN BEGIN PRINTNL(431);
UNROTATE(MEM[P+1].INT+MEM[P+2].INT-32768+MEM[WW+1].INT+MEM[WW+2].INT,MEM
[P+2].INT-32768+MEM[WW+2].INT,OCTANT);PRINTTWO(CURX,CURY);PRINT(430);
UNROTATE(MEM[Q+1].INT+MEM[Q+2].INT-32768+MEM[W+1].INT+MEM[W+2].INT,MEM[Q
+2].INT-32768+MEM[W+2].INT,OCTANT);PRINTTWO(CURX,CURY);END;
END ELSE BEGIN D1:=CURDD;D0:=DD0;END{:468};OFFSETPREP(P,H);{426:}Q:=P;
WHILE MEM[Q].HH.B1<>0 DO Q:=MEM[Q].HH.RH{:426};{471:}
IF ODD(OCTANTNUMBER[OCTANT])THEN BEGIN{472:}K:=0;W:=MEM[H].HH.RH;
WW:=MEM[W].HH.LH;XX0:=MEM[P+1].INT+MEM[W+1].INT;
YY0:=MEM[P+2].INT+MEM[W+2].INT;IF MEM[P+4].INT>=2 THEN{474:}
BEGIN SKEWLINEEDGE(MEM[P+1].INT+MEM[WW+1].INT,MEM[P+2].INT+MEM[WW+2].INT
,XX0,YY0);YY:=YY0-32768;XX:=XX0+YY;M0:=ROUNDUNSCALE(XX-XCORR[OCTANT]);
N0:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M0*65536>=YY-N0*65536+XYCORR[OCTANT]THEN D0:=1 ELSE D0:=0;
END{:474};XX1:=MEM[Q+1].INT+MEM[WW+1].INT;
YY1:=MEM[Q+2].INT+MEM[WW+2].INT;NN0:=FLOORUNSCALE(YY0-YCORR[OCTANT]);
NN1:=FLOORUNSCALE(YY1-YCORR[OCTANT]);
IF NN1-NN0>=MOVESIZE THEN OVERFLOW(390,MOVESIZE);
MM0:=FLOORUNSCALE(XX0-XYCORR[OCTANT]);
MM1:=FLOORUNSCALE(XX1-XYCORR[OCTANT]);
FOR N:=0 TO NN1-NN0 DO ENVMOVE[N]:=MM0;ENVMOVE[NN1-NN0]:=MM1;MOVEPTR:=0;
M:=MM0{:472};R:=P;MEM[Q].HH.B1:=MEM[H].HH.LH+1;
WHILE TRUE DO BEGIN IF R=Q THEN SMOOTHTOP:=MOVEPTR;
WHILE MEM[R].HH.B1<>K DO{476:}BEGIN XX:=MEM[R+1].INT+MEM[W+1].INT;
YY:=MEM[R+2].INT+MEM[W+2].INT;
IF INTERNAL[8]>65536 THEN BEGIN PRINTNL(433);PRINTINT(K);PRINT(434);
UNROTATE(XX+YY-32768,YY-32768,OCTANT);PRINTTWO(CURX,CURY);END;
IF MEM[R].HH.B1>K THEN BEGIN K:=K+1;W:=MEM[W].HH.RH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;
IF YP<>YY THEN{477:}BEGIN TY:=FLOORSCALED(YY-YCORR[OCTANT]);DELY:=YP-YY;
YY:=YY-TY;TY:=YP-YCORR[OCTANT]-TY;IF TY>=65536 THEN BEGIN DELX:=XP-XX;
YY:=65536-YY;
WHILE TRUE DO BEGIN TX:=TAKEFRACTION(DELX,MAKEFRACTION(YY,DELY));
IF ABVSCD(TX,DELY,DELX,YY)+XYCORR[OCTANT]>0 THEN TX:=TX-1;
M:=FLOORUNSCALE(XX+TX);IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;
TY:=TY-65536;IF TY<65536 THEN GOTO 31;YY:=YY+65536;MOVEPTR:=MOVEPTR+1;
END;31:END;END{:477};END ELSE BEGIN K:=K-1;W:=MEM[W].HH.LH;
XP:=MEM[R+1].INT+MEM[W+1].INT;YP:=MEM[R+2].INT+MEM[W+2].INT;END;
IF INTERNAL[8]>65536 THEN BEGIN PRINT(430);
UNROTATE(XP+YP-32768,YP-32768,OCTANT);PRINTTWO(CURX,CURY);PRINTNL(312);
END;M:=FLOORUNSCALE(XP-XYCORR[OCTANT]);
MOVEPTR:=FLOORUNSCALE(YP-YCORR[OCTANT])-NN0;
IF M>ENVMOVE[MOVEPTR]THEN ENVMOVE[MOVEPTR]:=M;END{:476};
IF R=P THEN SMOOTHBOT:=MOVEPTR;IF R=Q THEN GOTO 30;MOVE[MOVEPTR]:=1;
N:=MOVEPTR;S:=MEM[R].HH.RH;
MAKEMOVES(MEM[R+1].INT+MEM[W+1].INT,MEM[R+5].INT+MEM[W+1].INT,MEM[S+3].
INT+MEM[W+1].INT,MEM[S+1].INT+MEM[W+1].INT,MEM[R+2].INT+MEM[W+2].INT,MEM
[R+6].INT+MEM[W+2].INT,MEM[S+4].INT+MEM[W+2].INT,MEM[S+2].INT+MEM[W+2].
INT,XYCORR[OCTANT],YCORR[OCTANT]);{475:}REPEAT M:=M+MOVE[N]-1;
IF M>ENVMOVE[N]THEN ENVMOVE[N]:=M;N:=N+1;UNTIL N>MOVEPTR{:475};R:=S;END;
30:{478:}IF MEM[Q+6].INT<2 THEN BEGIN YY:=YY1-32768;XX:=XX1+YY;
M1:=ROUNDUNSCALE(XX-XCORR[OCTANT]);N1:=ROUNDUNSCALE(YY-YCORR[OCTANT]);
IF XX-M1*65536>=YY-N1*65536+XYCORR[OCTANT]THEN D1:=1 ELSE D1:=0;END;
IF(M<>MM1)OR(MOVEPTR<>NN1-NN0)THEN CONFUSION(49);
MOVE[0]:=D0+ENVMOVE[0]-MM0;
FOR N:=1 TO MOVEPTR DO MOVE[N]:=ENVMOVE[N]-ENVMOVE[N-1]+1;
MOVE[MOVEPTR]:=MOVE[MOVEPTR]-D1;
IF INTERNAL[29]>0 THEN SMOOTHMOVES(SMOOTHBOT,SMOOTHTOP);
MOVETOEDGES(M0,N0,M1,N1,OCTANT);
IF MEM[Q+6].INT<2 THEN BEGIN WW:=MEM[H].HH.RH;
SKEWLINEEDGE(XX1,YY1,MEM[Q+1].INT+MEM[WW+1].INT,MEM[Q+2].INT+MEM[WW+2].
INT);END{:478};END ELSE DUALMOVES(H,P,Q);MEM[Q].HH.B1:=0{:471};
P:=MEM[Q].HH.RH;UNTIL P=SPECHEAD;IF INTERNAL[8]>0 THEN ENDEDGETRACI;
TOSSKNOTLIST(SPECHEAD);END;{:467}{488:}
FUNCTION MAKEELLIPSE(MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE):HALFWORD;
LABEL 30,40;VAR P,Q,R,S:HALFWORD;H:HALFWORD;
ALPHA,BETA,GAMMA,DELTA:INTEGER;C,D:INTEGER;U,V:INTEGER;BEGIN{489:}
P:=GETNODE(7);Q:=GETNODE(7);R:=GETNODE(7);S:=GETNODE(7);H:=P;
MEM[P].HH.RH:=Q;MEM[Q].HH.RH:=R;MEM[R].HH.RH:=S;{491:}
IF(THETA=0)OR(MAJORAXIS=MINORAXIS)THEN BEGIN ALPHA:=0;BETA:=MINORAXIS;
GAMMA:=MAJORAXIS;END ELSE BEGIN NSINCOS(THETA);
GAMMA:=TAKEFRACTION(MAJORAXIS,NSIN);DELTA:=TAKEFRACTION(MINORAXIS,NCOS);
BETA:=PYTHADD(GAMMA,DELTA);
ALPHA:=TAKEFRACTION(TAKEFRACTION(MAJORAXIS,MAKEFRACTION(GAMMA,BETA)),
NCOS)-TAKEFRACTION(TAKEFRACTION(MINORAXIS,MAKEFRACTION(DELTA,BETA)),NSIN
);ALPHA:=(ALPHA+32768)DIV 65536;
GAMMA:=PYTHADD(TAKEFRACTION(MAJORAXIS,NCOS),TAKEFRACTION(MINORAXIS,NSIN)
);END;BETA:=(BETA+32768)DIV 65536;GAMMA:=(GAMMA+32768)DIV 65536{:491};
{490:}IF BETA=0 THEN BETA:=1;IF GAMMA=0 THEN GAMMA:=1;
IF GAMMA<=ABS(ALPHA)THEN IF ALPHA>0 THEN ALPHA:=GAMMA-1 ELSE ALPHA:=1-
GAMMA{:490};MEM[S+1].INT:=ALPHA*32768;MEM[P+1].INT:=-MEM[S+1].INT;
MEM[S+2].INT:=BETA*32768;MEM[P+2].INT:=-MEM[S+2].INT;
MEM[Q+2].INT:=MEM[P+2].INT;MEM[R+2].INT:=MEM[S+2].INT;
MEM[Q+1].INT:=GAMMA*32768;MEM[R+1].INT:=MEM[Q+1].INT;MEM[P+5].INT:=0;
MEM[Q+3].INT:=-32768;MEM[Q+5].INT:=32768;MEM[R+3].INT:=0;
MEM[R+5].INT:=0;MEM[S+3].INT:=32768;MEM[P+6].INT:=BETA;
MEM[Q+6].INT:=GAMMA;MEM[R+6].INT:=BETA;MEM[Q+4].INT:=GAMMA+ALPHA;
MEM[R+4].INT:=BETA+BETA;MEM[S+4].INT:=GAMMA-ALPHA{:489};{492:}
WHILE TRUE DO BEGIN U:=MEM[P+5].INT+MEM[Q+5].INT;
V:=MEM[Q+3].INT+MEM[R+3].INT;C:=MEM[P+6].INT+MEM[Q+6].INT;{494:}
DELTA:=PYTHADD(U,V);
IF MAJORAXIS=MINORAXIS THEN D:=MAJORAXIS ELSE BEGIN IF THETA=0 THEN
BEGIN ALPHA:=U;BETA:=V;
END ELSE BEGIN ALPHA:=TAKEFRACTION(U,NCOS)+TAKEFRACTION(V,NSIN);
BETA:=TAKEFRACTION(V,NCOS)-TAKEFRACTION(U,NSIN);END;
ALPHA:=MAKEFRACTION(ALPHA,DELTA);BETA:=MAKEFRACTION(BETA,DELTA);
D:=PYTHADD(TAKEFRACTION(MAJORAXIS,ALPHA),TAKEFRACTION(MINORAXIS,BETA));
END;D:=TAKEFRACTION((D+4)DIV 8,DELTA);
IF ABS(U)>=ABS(V)THEN ALPHA:=ABS(U)DIV 32768 ELSE ALPHA:=ABS(V)DIV 32768
;IF D<ALPHA THEN D:=ALPHA{:494};DELTA:=C-D;
IF DELTA>0 THEN BEGIN IF DELTA>MEM[R+4].INT THEN DELTA:=MEM[R+4].INT;
IF DELTA>=MEM[Q+4].INT THEN{495:}BEGIN DELTA:=MEM[Q+4].INT;
MEM[P+6].INT:=C-DELTA;MEM[P+5].INT:=U;MEM[Q+3].INT:=V;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:495}ELSE{496:}BEGIN S:=GETNODE(7);
MEM[P].HH.RH:=S;MEM[S].HH.RH:=Q;
MEM[S+1].INT:=MEM[Q+1].INT+DELTA*MEM[Q+3].INT;
MEM[S+2].INT:=MEM[Q+2].INT-DELTA*MEM[P+5].INT;
MEM[Q+1].INT:=MEM[Q+1].INT-DELTA*MEM[R+3].INT;
MEM[Q+2].INT:=MEM[Q+2].INT+DELTA*MEM[Q+5].INT;
MEM[S+3].INT:=MEM[Q+3].INT;MEM[S+5].INT:=U;MEM[Q+3].INT:=V;
MEM[S+6].INT:=C-DELTA;MEM[S+4].INT:=MEM[Q+4].INT-DELTA;
MEM[Q+4].INT:=DELTA;MEM[R+4].INT:=MEM[R+4].INT-DELTA;END{:496};
END ELSE P:=Q;{493:}WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF Q=0 THEN GOTO 30;
IF MEM[Q+4].INT=0 THEN BEGIN MEM[P].HH.RH:=MEM[Q].HH.RH;
MEM[P+6].INT:=MEM[Q+6].INT;MEM[P+5].INT:=MEM[Q+5].INT;FREENODE(Q,7);
END ELSE BEGIN R:=MEM[Q].HH.RH;IF R=0 THEN GOTO 30;
IF MEM[R+4].INT=0 THEN BEGIN MEM[P].HH.RH:=R;FREENODE(Q,7);P:=R;
END ELSE GOTO 40;END;END;40:{:493};END;30:{:492};{497:}
IF Q<>0 THEN BEGIN IF MEM[H+5].INT=0 THEN BEGIN P:=H;H:=MEM[H].HH.RH;
FREENODE(P,7);MEM[Q+1].INT:=-MEM[H+1].INT;END;P:=Q;END ELSE Q:=P;
R:=MEM[H].HH.RH;REPEAT S:=GETNODE(7);MEM[P].HH.RH:=S;P:=S;
MEM[P+1].INT:=-MEM[R+1].INT;MEM[P+2].INT:=-MEM[R+2].INT;R:=MEM[R].HH.RH;
UNTIL R=Q;MEM[P].HH.RH:=H{:497};MAKEELLIPSE:=H;END;{:488}{499:}
FUNCTION FINDDIRECTIO(X,Y:SCALED;H:HALFWORD):SCALED;LABEL 10,40,45,30;
VAR MAX:SCALED;P,Q:HALFWORD;N:SCALED;TT:SCALED;{502:}
X1,X2,X3,Y1,Y2,Y3:SCALED;THETA,PHI:ANGLE;T:FRACTION;{:502}BEGIN{500:}
IF ABS(X)<ABS(Y)THEN BEGIN X:=MAKEFRACTION(X,ABS(Y));
IF Y>0 THEN Y:=268435456 ELSE Y:=-268435456;
END ELSE IF X=0 THEN BEGIN FINDDIRECTIO:=0;GOTO 10;
END ELSE BEGIN Y:=MAKEFRACTION(Y,ABS(X));
IF X>0 THEN X:=268435456 ELSE X:=-268435456;END{:500};N:=0;P:=H;
WHILE TRUE DO BEGIN IF MEM[P].HH.B1=0 THEN GOTO 45;Q:=MEM[P].HH.RH;
{501:}TT:=0;{503:}X1:=MEM[P+5].INT-MEM[P+1].INT;
X2:=MEM[Q+3].INT-MEM[P+5].INT;X3:=MEM[Q+1].INT-MEM[Q+3].INT;
Y1:=MEM[P+6].INT-MEM[P+2].INT;Y2:=MEM[Q+4].INT-MEM[P+6].INT;
Y3:=MEM[Q+2].INT-MEM[Q+4].INT;MAX:=ABS(X1);
IF ABS(X2)>MAX THEN MAX:=ABS(X2);IF ABS(X3)>MAX THEN MAX:=ABS(X3);
IF ABS(Y1)>MAX THEN MAX:=ABS(Y1);IF ABS(Y2)>MAX THEN MAX:=ABS(Y2);
IF ABS(Y3)>MAX THEN MAX:=ABS(Y3);IF MAX=0 THEN GOTO 40;
WHILE MAX<134217728 DO BEGIN MAX:=MAX+MAX;X1:=X1+X1;X2:=X2+X2;X3:=X3+X3;
Y1:=Y1+Y1;Y2:=Y2+Y2;Y3:=Y3+Y3;END;T:=X1;
X1:=TAKEFRACTION(X1,X)+TAKEFRACTION(Y1,Y);
Y1:=TAKEFRACTION(Y1,X)-TAKEFRACTION(T,Y);T:=X2;
X2:=TAKEFRACTION(X2,X)+TAKEFRACTION(Y2,Y);
Y2:=TAKEFRACTION(Y2,X)-TAKEFRACTION(T,Y);T:=X3;
X3:=TAKEFRACTION(X3,X)+TAKEFRACTION(Y3,Y);
Y3:=TAKEFRACTION(Y3,X)-TAKEFRACTION(T,Y){:503};
IF Y1=0 THEN IF X1>=0 THEN GOTO 40;IF N>0 THEN BEGIN{504:}
THETA:=NARG(X1,Y1);
IF THETA>=0 THEN IF PHI<=0 THEN IF PHI>=THETA-188743680 THEN GOTO 40;
IF THETA<=0 THEN IF PHI>=0 THEN IF PHI<=THETA+188743680 THEN GOTO 40{:
504};IF P=H THEN GOTO 45;END;PHI:=NARG(X3,Y3);{506:}
IF X1<0 THEN IF X2<0 THEN IF X3<0 THEN GOTO 30;
IF ABVSCD(Y1,Y3,Y2,Y2)=0 THEN{508:}
BEGIN IF ABVSCD(Y1,Y2,0,0)<0 THEN BEGIN T:=MAKEFRACTION(Y1,Y1-Y2);
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;
END;END ELSE IF Y1=0 THEN IF Y3=0 THEN{509:}
BEGIN T:=CROSSINGPOIN(-X1,-X2,-X3);
IF T<=268435456 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;
IF ABVSCD(X1,X3,X2,X2)<=0 THEN BEGIN T:=MAKEFRACTION(X1,X1-X2);
BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END;END{:509};GOTO 30;END{:508};
IF Y1<=0 THEN IF Y1<0 THEN BEGIN Y1:=-Y1;Y2:=-Y2;Y3:=-Y3;
END ELSE IF Y2>0 THEN BEGIN Y2:=-Y2;Y3:=-Y3;END;{507:}
T:=CROSSINGPOIN(Y1,Y2,Y3);IF T>268435456 THEN GOTO 30;
Y2:=Y2-TAKEFRACTION(Y2-Y3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
X2:=X2-TAKEFRACTION(X2-X3,T);X1:=X1-TAKEFRACTION(X1-X2,T);
IF X1>=0 THEN BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;IF Y2>0 THEN Y2:=0;
TT:=T;T:=CROSSINGPOIN(0,-Y2,-Y3);IF T>268435456 THEN GOTO 30;
X1:=X1-TAKEFRACTION(X1-X2,T);X2:=X2-TAKEFRACTION(X2-X3,T);
IF X1-TAKEFRACTION(X1-X2,T)>=0 THEN BEGIN T:=TT-TAKEFRACTION(TT
-268435456,T);BEGIN TT:=(T+2048)DIV 4096;GOTO 40;END;END{:507};30:{:506}
{:501};P:=Q;N:=N+65536;END;45:FINDDIRECTIO:=-65536;GOTO 10;
40:FINDDIRECTIO:=N+TT;10:END;{:499}{515:}
PROCEDURE CUBICINTERSE(P,PP:HALFWORD);LABEL 22,45,10;VAR Q,QQ:HALFWORD;
BEGIN{517:}Q:=MEM[P].HH.RH;QQ:=MEM[PP].HH.RH;BISECTPTR:=20;
BISECTSTACK[BISECTPTR-5]:=MEM[P+5].INT-MEM[P+1].INT;
BISECTSTACK[BISECTPTR-4]:=MEM[Q+3].INT-MEM[P+5].INT;
BISECTSTACK[BISECTPTR-3]:=MEM[Q+1].INT-MEM[Q+3].INT;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-10]:=MEM[P+6].INT-MEM[P+2].INT;
BISECTSTACK[BISECTPTR-9]:=MEM[Q+4].INT-MEM[P+6].INT;
BISECTSTACK[BISECTPTR-8]:=MEM[Q+2].INT-MEM[Q+4].INT;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-15]:=MEM[PP+5].INT-MEM[PP+1].INT;
BISECTSTACK[BISECTPTR-14]:=MEM[QQ+3].INT-MEM[PP+5].INT;
BISECTSTACK[BISECTPTR-13]:=MEM[QQ+1].INT-MEM[QQ+3].INT;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-20]:=MEM[PP+6].INT-MEM[PP+2].INT;
BISECTSTACK[BISECTPTR-19]:=MEM[QQ+4].INT-MEM[PP+6].INT;
BISECTSTACK[BISECTPTR-18]:=MEM[QQ+2].INT-MEM[QQ+4].INT;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
DELX:=MEM[P+1].INT-MEM[PP+1].INT;DELY:=MEM[P+2].INT-MEM[PP+2].INT;
UV:=BISECTPTR;XY:=BISECTPTR;CURT:=1;CURTT:=1{:517};
WHILE TRUE DO BEGIN 22:IF DELX<=BISECTSTACK[XY-11]-BISECTSTACK[UV-2]THEN
IF DELX>=BISECTSTACK[XY-12]-BISECTSTACK[UV-1]THEN IF DELY<=BISECTSTACK[
XY-16]-BISECTSTACK[UV-7]THEN IF DELY>=BISECTSTACK[XY-17]-BISECTSTACK[UV
-6]THEN BEGIN IF CURT>=131072 THEN BEGIN CURT:=(CURT+1)DIV 2;
CURTT:=(CURTT+1)DIV 2;GOTO 10;END;{518:}BISECTSTACK[BISECTPTR]:=DELX;
BISECTSTACK[BISECTPTR+1]:=DELY;BISECTSTACK[BISECTPTR+2]:=UV;
BISECTSTACK[BISECTPTR+3]:=XY;BISECTPTR:=BISECTPTR+44;CURT:=CURT+CURT;
CURTT:=CURTT+CURTT;BISECTSTACK[BISECTPTR-25]:=BISECTSTACK[UV-5];
BISECTSTACK[BISECTPTR-3]:=BISECTSTACK[UV-3];
BISECTSTACK[BISECTPTR-24]:=(BISECTSTACK[BISECTPTR-25]+BISECTSTACK[UV-4])
DIV 2;
BISECTSTACK[BISECTPTR-4]:=(BISECTSTACK[BISECTPTR-3]+BISECTSTACK[UV-4])
DIV 2;BISECTSTACK[BISECTPTR-23]:=(BISECTSTACK[BISECTPTR-24]+BISECTSTACK[
BISECTPTR-4])DIV 2;BISECTSTACK[BISECTPTR-5]:=BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-25]<0 THEN IF BISECTSTACK[BISECTPTR-23]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-24]<0 THEN BISECTSTACK[BISECTPTR-22]:=
BISECTSTACK[BISECTPTR-25]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-21]<0 THEN BISECTSTACK[BISECTPTR-21]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-23]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-24]>0 THEN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25
]+BISECTSTACK[BISECTPTR-24]ELSE BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[
BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25]+
BISECTSTACK[BISECTPTR-24]+BISECTSTACK[BISECTPTR-23];
IF BISECTSTACK[BISECTPTR-21]<BISECTSTACK[BISECTPTR-25]THEN BISECTSTACK[
BISECTPTR-21]:=BISECTSTACK[BISECTPTR-25];
BISECTSTACK[BISECTPTR-22]:=BISECTSTACK[BISECTPTR-25]+BISECTSTACK[
BISECTPTR-24];
IF BISECTSTACK[BISECTPTR-22]>0 THEN BISECTSTACK[BISECTPTR-22]:=0;END;
IF BISECTSTACK[BISECTPTR-5]<0 THEN IF BISECTSTACK[BISECTPTR-3]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-4]<0 THEN BISECTSTACK[BISECTPTR-2]:=
BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-1]<0 THEN BISECTSTACK[BISECTPTR-1]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-3]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-4]>0 THEN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]ELSE BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[
BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5]+
BISECTSTACK[BISECTPTR-4]+BISECTSTACK[BISECTPTR-3];
IF BISECTSTACK[BISECTPTR-1]<BISECTSTACK[BISECTPTR-5]THEN BISECTSTACK[
BISECTPTR-1]:=BISECTSTACK[BISECTPTR-5];
BISECTSTACK[BISECTPTR-2]:=BISECTSTACK[BISECTPTR-5]+BISECTSTACK[BISECTPTR
-4];IF BISECTSTACK[BISECTPTR-2]>0 THEN BISECTSTACK[BISECTPTR-2]:=0;END;
BISECTSTACK[BISECTPTR-30]:=BISECTSTACK[UV-10];
BISECTSTACK[BISECTPTR-8]:=BISECTSTACK[UV-8];
BISECTSTACK[BISECTPTR-29]:=(BISECTSTACK[BISECTPTR-30]+BISECTSTACK[UV-9])
DIV 2;
BISECTSTACK[BISECTPTR-9]:=(BISECTSTACK[BISECTPTR-8]+BISECTSTACK[UV-9])
DIV 2;BISECTSTACK[BISECTPTR-28]:=(BISECTSTACK[BISECTPTR-29]+BISECTSTACK[
BISECTPTR-9])DIV 2;BISECTSTACK[BISECTPTR-10]:=BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-30]<0 THEN IF BISECTSTACK[BISECTPTR-28]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-29]<0 THEN BISECTSTACK[BISECTPTR-27]:=
BISECTSTACK[BISECTPTR-30]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-26]<0 THEN BISECTSTACK[BISECTPTR-26]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-28]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-29]>0 THEN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30
]+BISECTSTACK[BISECTPTR-29]ELSE BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[
BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30]+
BISECTSTACK[BISECTPTR-29]+BISECTSTACK[BISECTPTR-28];
IF BISECTSTACK[BISECTPTR-26]<BISECTSTACK[BISECTPTR-30]THEN BISECTSTACK[
BISECTPTR-26]:=BISECTSTACK[BISECTPTR-30];
BISECTSTACK[BISECTPTR-27]:=BISECTSTACK[BISECTPTR-30]+BISECTSTACK[
BISECTPTR-29];
IF BISECTSTACK[BISECTPTR-27]>0 THEN BISECTSTACK[BISECTPTR-27]:=0;END;
IF BISECTSTACK[BISECTPTR-10]<0 THEN IF BISECTSTACK[BISECTPTR-8]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-9]<0 THEN BISECTSTACK[BISECTPTR-7]:=
BISECTSTACK[BISECTPTR-10]+BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-6]<0 THEN BISECTSTACK[BISECTPTR-6]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-8]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-9]>0 THEN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]ELSE BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[
BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10]+
BISECTSTACK[BISECTPTR-9]+BISECTSTACK[BISECTPTR-8];
IF BISECTSTACK[BISECTPTR-6]<BISECTSTACK[BISECTPTR-10]THEN BISECTSTACK[
BISECTPTR-6]:=BISECTSTACK[BISECTPTR-10];
BISECTSTACK[BISECTPTR-7]:=BISECTSTACK[BISECTPTR-10]+BISECTSTACK[
BISECTPTR-9];
IF BISECTSTACK[BISECTPTR-7]>0 THEN BISECTSTACK[BISECTPTR-7]:=0;END;
BISECTSTACK[BISECTPTR-35]:=BISECTSTACK[XY-15];
BISECTSTACK[BISECTPTR-13]:=BISECTSTACK[XY-13];
BISECTSTACK[BISECTPTR-34]:=(BISECTSTACK[BISECTPTR-35]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-14]:=(BISECTSTACK[BISECTPTR-13]+BISECTSTACK[XY-14]
)DIV 2;
BISECTSTACK[BISECTPTR-33]:=(BISECTSTACK[BISECTPTR-34]+BISECTSTACK[
BISECTPTR-14])DIV 2;
BISECTSTACK[BISECTPTR-15]:=BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-35]<0 THEN IF BISECTSTACK[BISECTPTR-33]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-34]<0 THEN BISECTSTACK[BISECTPTR-32]:=
BISECTSTACK[BISECTPTR-35]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-31]<0 THEN BISECTSTACK[BISECTPTR-31]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-33]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-34]>0 THEN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35
]+BISECTSTACK[BISECTPTR-34]ELSE BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[
BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35]+
BISECTSTACK[BISECTPTR-34]+BISECTSTACK[BISECTPTR-33];
IF BISECTSTACK[BISECTPTR-31]<BISECTSTACK[BISECTPTR-35]THEN BISECTSTACK[
BISECTPTR-31]:=BISECTSTACK[BISECTPTR-35];
BISECTSTACK[BISECTPTR-32]:=BISECTSTACK[BISECTPTR-35]+BISECTSTACK[
BISECTPTR-34];
IF BISECTSTACK[BISECTPTR-32]>0 THEN BISECTSTACK[BISECTPTR-32]:=0;END;
IF BISECTSTACK[BISECTPTR-15]<0 THEN IF BISECTSTACK[BISECTPTR-13]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-14]<0 THEN BISECTSTACK[BISECTPTR-12]:=
BISECTSTACK[BISECTPTR-15]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-11]<0 THEN BISECTSTACK[BISECTPTR-11]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-13]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-14]>0 THEN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15
]+BISECTSTACK[BISECTPTR-14]ELSE BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[
BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15]+
BISECTSTACK[BISECTPTR-14]+BISECTSTACK[BISECTPTR-13];
IF BISECTSTACK[BISECTPTR-11]<BISECTSTACK[BISECTPTR-15]THEN BISECTSTACK[
BISECTPTR-11]:=BISECTSTACK[BISECTPTR-15];
BISECTSTACK[BISECTPTR-12]:=BISECTSTACK[BISECTPTR-15]+BISECTSTACK[
BISECTPTR-14];
IF BISECTSTACK[BISECTPTR-12]>0 THEN BISECTSTACK[BISECTPTR-12]:=0;END;
BISECTSTACK[BISECTPTR-40]:=BISECTSTACK[XY-20];
BISECTSTACK[BISECTPTR-18]:=BISECTSTACK[XY-18];
BISECTSTACK[BISECTPTR-39]:=(BISECTSTACK[BISECTPTR-40]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-19]:=(BISECTSTACK[BISECTPTR-18]+BISECTSTACK[XY-19]
)DIV 2;
BISECTSTACK[BISECTPTR-38]:=(BISECTSTACK[BISECTPTR-39]+BISECTSTACK[
BISECTPTR-19])DIV 2;
BISECTSTACK[BISECTPTR-20]:=BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-40]<0 THEN IF BISECTSTACK[BISECTPTR-38]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-39]<0 THEN BISECTSTACK[BISECTPTR-37]:=
BISECTSTACK[BISECTPTR-40]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-36]<0 THEN BISECTSTACK[BISECTPTR-36]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-38]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-39]>0 THEN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40
]+BISECTSTACK[BISECTPTR-39]ELSE BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[
BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40]+
BISECTSTACK[BISECTPTR-39]+BISECTSTACK[BISECTPTR-38];
IF BISECTSTACK[BISECTPTR-36]<BISECTSTACK[BISECTPTR-40]THEN BISECTSTACK[
BISECTPTR-36]:=BISECTSTACK[BISECTPTR-40];
BISECTSTACK[BISECTPTR-37]:=BISECTSTACK[BISECTPTR-40]+BISECTSTACK[
BISECTPTR-39];
IF BISECTSTACK[BISECTPTR-37]>0 THEN BISECTSTACK[BISECTPTR-37]:=0;END;
IF BISECTSTACK[BISECTPTR-20]<0 THEN IF BISECTSTACK[BISECTPTR-18]>=0 THEN
BEGIN IF BISECTSTACK[BISECTPTR-19]<0 THEN BISECTSTACK[BISECTPTR-17]:=
BISECTSTACK[BISECTPTR-20]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-16]<0 THEN BISECTSTACK[BISECTPTR-16]:=0;
END ELSE IF BISECTSTACK[BISECTPTR-18]<=0 THEN BEGIN IF BISECTSTACK[
BISECTPTR-19]>0 THEN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20
]+BISECTSTACK[BISECTPTR-19]ELSE BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[
BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;
END ELSE BEGIN BISECTSTACK[BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20]+
BISECTSTACK[BISECTPTR-19]+BISECTSTACK[BISECTPTR-18];
IF BISECTSTACK[BISECTPTR-16]<BISECTSTACK[BISECTPTR-20]THEN BISECTSTACK[
BISECTPTR-16]:=BISECTSTACK[BISECTPTR-20];
BISECTSTACK[BISECTPTR-17]:=BISECTSTACK[BISECTPTR-20]+BISECTSTACK[
BISECTPTR-19];
IF BISECTSTACK[BISECTPTR-17]>0 THEN BISECTSTACK[BISECTPTR-17]:=0;END;
UV:=BISECTPTR-20;XY:=BISECTPTR-20;DELX:=DELX+DELX;DELY:=DELY+DELY{:518};
GOTO 22;END;{519:}45:IF ODD(CURTT)THEN IF ODD(CURT)THEN{520:}
BEGIN CURT:=(CURT)DIV 2;CURTT:=(CURTT)DIV 2;IF CURT=0 THEN GOTO 10;
BISECTPTR:=BISECTPTR-44;DELX:=BISECTSTACK[BISECTPTR];
DELY:=BISECTSTACK[BISECTPTR+1];UV:=BISECTSTACK[BISECTPTR+2];
XY:=BISECTSTACK[BISECTPTR+3];GOTO 45;END{:520}ELSE BEGIN CURT:=CURT+1;
DELX:=DELX+BISECTSTACK[UV-5]+BISECTSTACK[UV-4]+BISECTSTACK[UV-3];
DELY:=DELY+BISECTSTACK[UV-10]+BISECTSTACK[UV-9]+BISECTSTACK[UV-8];
UV:=UV+20;CURTT:=CURTT-1;XY:=XY-20;
DELX:=DELX+BISECTSTACK[XY-15]+BISECTSTACK[XY-14]+BISECTSTACK[XY-13];
DELY:=DELY+BISECTSTACK[XY-20]+BISECTSTACK[XY-19]+BISECTSTACK[XY-18];
END ELSE BEGIN CURTT:=CURTT+1;
DELX:=DELX-BISECTSTACK[XY-15]-BISECTSTACK[XY-14]-BISECTSTACK[XY-13];
DELY:=DELY-BISECTSTACK[XY-20]-BISECTSTACK[XY-19]-BISECTSTACK[XY-18];
XY:=XY+20;END{:519};END;10:END;{:515}{521:}
PROCEDURE PATHINTERSEC(H,HH:HALFWORD);LABEL 10;VAR P,PP:HALFWORD;
N,NN:INTEGER;BEGIN{522:}
IF MEM[H].HH.B1=0 THEN BEGIN MEM[H+5].INT:=MEM[H+1].INT;
MEM[H+3].INT:=MEM[H+1].INT;MEM[H+6].INT:=MEM[H+2].INT;
MEM[H+4].INT:=MEM[H+2].INT;MEM[H].HH.B1:=1;END;
IF MEM[HH].HH.B1=0 THEN BEGIN MEM[HH+5].INT:=MEM[HH+1].INT;
MEM[HH+3].INT:=MEM[HH+1].INT;MEM[HH+6].INT:=MEM[HH+2].INT;
MEM[HH+4].INT:=MEM[HH+2].INT;MEM[HH].HH.B1:=1;END;{:522};N:=-65536;P:=H;
REPEAT IF MEM[P].HH.B1<>0 THEN BEGIN NN:=-65536;PP:=HH;
REPEAT IF MEM[PP].HH.B1<>0 THEN BEGIN CUBICINTERSE(P,PP);
IF CURT>0 THEN BEGIN CURT:=CURT+N;CURTT:=CURTT+NN;GOTO 10;END;END;
NN:=NN+65536;PP:=MEM[PP].HH.RH;UNTIL PP=HH;END;N:=N+65536;
P:=MEM[P].HH.RH;UNTIL P=H;CURT:=-65536;CURTT:=-65536;10:END;{:521}{523:}
FUNCTION INITSC:BOOLEAN;EXTERN;PROCEDURE UPDSCR;EXTERN;{:523}{526:}
PROCEDURE BLANKR(LEFTCOL,RIGHTCOL:SCREENCOL;TOPROW,BOTROW:SCREENROW);
EXTERN;{:526}{527:}PROCEDURE PAINTR(R:SCREENROW;B:PIXELCOLOR;
VAR A:TRANSSPEC;N:SCREENCOL);EXTERN;{:527}{533:}
PROCEDURE OPENAWINDOW(K:WINDOWNUMBER;R0,C0,R1,C1:SCALED;X,Y:SCALED);
VAR M,N:INTEGER;BEGIN{534:}IF R0<0 THEN R0:=0 ELSE R0:=ROUNDUNSCALE(R0);
R1:=ROUNDUNSCALE(R1);IF R1>SCREENDEPTH THEN R1:=SCREENDEPTH;
IF R1<R0 THEN IF R0>SCREENDEPTH THEN R0:=R1 ELSE R1:=R0;
IF C0<0 THEN C0:=0 ELSE C0:=ROUNDUNSCALE(C0);C1:=ROUNDUNSCALE(C1);
IF C1>SCREENWIDTH THEN C1:=SCREENWIDTH;
IF C1<C0 THEN IF C0>SCREENWIDTH THEN C0:=C1 ELSE C1:=C0{:534};
WINDOWOPEN[K]:=TRUE;WINDOWTIME[K]:=WINDOWTIME[K]+1;LEFTCOL[K]:=C0;
RIGHTCOL[K]:=C1;TOPROW[K]:=R0;BOTROW[K]:=R1;{535:}M:=ROUNDUNSCALE(X);
N:=ROUNDUNSCALE(Y)-1;MWINDOW[K]:=C0-M;NWINDOW[K]:=R0+N{:535};
BEGIN IF NOT SCREENSTARTE THEN BEGIN SCREENOK:=INITSC;
SCREENSTARTE:=TRUE;END;END;IF SCREENOK THEN BEGIN BLANKR(C0,C1,R0,R1);
UPDSCR;END;END;{:533}{536:}PROCEDURE DISPEDGES(K:WINDOWNUMBER);
LABEL 30,40;VAR P,Q:HALFWORD;ALREADYTHERE:BOOLEAN;R:INTEGER;{539:}
N:SCREENCOL;W,WW:INTEGER;B:PIXELCOLOR;M,MM:INTEGER;D:INTEGER;
MADJUSTMENT:INTEGER;RIGHTEDGE:INTEGER;MINCOL:SCREENCOL;{:539}
BEGIN IF SCREENOK THEN IF LEFTCOL[K]<RIGHTCOL[K]THEN IF TOPROW[K]<BOTROW
[K]THEN BEGIN ALREADYTHERE:=FALSE;
IF MEM[CUREDGES+3].HH.RH=K THEN IF MEM[CUREDGES+4].INT=WINDOWTIME[K]THEN
ALREADYTHERE:=TRUE;
IF NOT ALREADYTHERE THEN BLANKR(LEFTCOL[K],RIGHTCOL[K],TOPROW[K],BOTROW[
K]);{540:}MADJUSTMENT:=MWINDOW[K]-MEM[CUREDGES+3].HH.LH;
RIGHTEDGE:=8*(RIGHTCOL[K]-MADJUSTMENT);MINCOL:=LEFTCOL[K]{:540};
P:=MEM[CUREDGES].HH.RH;R:=NWINDOW[K]-(MEM[CUREDGES+1].HH.LH-4096);
WHILE(P<>CUREDGES)AND(R>=TOPROW[K])DO BEGIN IF R<BOTROW[K]THEN{537:}
BEGIN IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P)ELSE IF MEM[P+1].HH.LH=1 THEN
IF ALREADYTHERE THEN GOTO 30;MEM[P+1].HH.LH:=1;{541:}N:=0;WW:=0;M:=-1;
W:=0;Q:=MEM[P+1].HH.RH;ROWTRANSITIO[0]:=MINCOL;
WHILE TRUE DO BEGIN IF Q=26000 THEN D:=RIGHTEDGE ELSE D:=MEM[Q].HH.LH;
MM:=(D DIV 8)+MADJUSTMENT;IF MM<>M THEN BEGIN{542:}
IF W<=0 THEN BEGIN IF WW>0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN IF
ALREADYTHERE THEN BEGIN B:=0;N:=N+1;END ELSE B:=1 ELSE N:=N+1;
ROWTRANSITIO[N]:=M;END;
END ELSE IF WW<=0 THEN IF M>MINCOL THEN BEGIN IF N=0 THEN B:=1;N:=N+1;
ROWTRANSITIO[N]:=M;END{:542};M:=MM;W:=WW;END;
IF D>=RIGHTEDGE THEN GOTO 40;WW:=WW+(D MOD 8)-4;Q:=MEM[Q].HH.RH;END;
40:{543:}
IF ALREADYTHERE OR(WW>0)THEN BEGIN IF N=0 THEN IF WW>0 THEN B:=1 ELSE B
:=0;N:=N+1;ROWTRANSITIO[N]:=RIGHTCOL[K];
END ELSE IF N=0 THEN GOTO 30{:543};{:541};PAINTR(R,B,ROWTRANSITIO,N);
30:END{:537};P:=MEM[P].HH.RH;R:=R-1;END;UPDSCR;
WINDOWTIME[K]:=WINDOWTIME[K]+1;MEM[CUREDGES+3].HH.RH:=K;
MEM[CUREDGES+4].INT:=WINDOWTIME[K];END;END;{:536}{549:}
FUNCTION MAXCOEF(P:HALFWORD):FRACTION;VAR X:FRACTION;BEGIN X:=0;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF ABS(MEM[P+1].INT)>X THEN X:=ABS(MEM[P
+1].INT);P:=MEM[P].HH.RH;END;MAXCOEF:=X;END;{:549}{555:}
FUNCTION PPLUSQ(P:HALFWORD;Q:HALFWORD;T:SMALLNUMBER):HALFWORD;LABEL 30;
VAR PP,QQ:HALFWORD;R,S:HALFWORD;THRESHOLD:INTEGER;V:INTEGER;
BEGIN IF T=16 THEN THRESHOLD:=2685 ELSE THRESHOLD:=8;R:=26001;
PP:=MEM[P].HH.LH;QQ:=MEM[Q].HH.LH;
WHILE TRUE DO IF PP=QQ THEN IF PP=0 THEN GOTO 30 ELSE{556:}
BEGIN V:=MEM[P+1].INT+MEM[Q+1].INT;MEM[P+1].INT:=V;S:=P;P:=MEM[P].HH.RH;
PP:=MEM[P].HH.LH;
IF ABS(V)<THRESHOLD THEN FREENODE(S,2)ELSE BEGIN IF ABS(V)>=626349397
THEN IF WATCHCOEFS THEN BEGIN MEM[QQ].HH.B0:=0;FIXNEEDED:=TRUE;END;
MEM[R].HH.RH:=S;R:=S;END;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;END{:556}
ELSE IF PP<QQ THEN BEGIN S:=GETNODE(2);MEM[S].HH.LH:=QQ;
MEM[S+1].INT:=MEM[Q+1].INT;Q:=MEM[Q].HH.RH;QQ:=MEM[Q].HH.LH;
MEM[R].HH.RH:=S;R:=S;END ELSE BEGIN MEM[R].HH.RH:=P;R:=P;
P:=MEM[P].HH.RH;PP:=MEM[P].HH.LH;END;
30:MEM[P+1].INT:=MEM[P+1].INT+MEM[Q+1].INT;MEM[R].HH.RH:=P;DEPFINAL:=P;
PPLUSQ:=MEM[26001].HH.RH;END;{:555}{557:}FUNCTION PTIMESV(P:HALFWORD;
V:INTEGER;T0,T1:SMALLNUMBER;VISSCALED:BOOLEAN):HALFWORD;
VAR R,S:HALFWORD;W:INTEGER;THRESHOLD:INTEGER;SCALINGDOWN:BOOLEAN;
BEGIN IF T0<>T1 THEN SCALINGDOWN:=TRUE ELSE SCALINGDOWN:=NOT VISSCALED;
IF T1=16 THEN THRESHOLD:=1342 ELSE THRESHOLD:=4;R:=26001;
WHILE MEM[P].HH.LH<>0 DO BEGIN IF SCALINGDOWN THEN W:=TAKEFRACTION(V,MEM
[P+1].INT)ELSE W:=TAKESCALED(V,MEM[P+1].INT);
IF ABS(W)<=THRESHOLD THEN BEGIN S:=MEM[P].HH.RH;FREENODE(P,2);P:=S;
END ELSE BEGIN IF ABS(W)>=626349397 THEN BEGIN FIXNEEDED:=TRUE;
MEM[MEM[P].HH.LH].HH.B0:=0;END;MEM[R].HH.RH:=P;R:=P;MEM[P+1].INT:=W;
P:=MEM[P].HH.RH;END;END;MEM[R].HH.RH:=P;
IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM[P+1].
INT:=TAKEFRACTION(MEM[P+1].INT,V);PTIMESV:=MEM[26001].HH.RH;END;{:557}
{559:}FUNCTION PWITHXBECOMI(P,X,Q:HALFWORD;T:SMALLNUMBER):HALFWORD;
VAR R,S:HALFWORD;V:INTEGER;BEGIN S:=P;R:=26001;
WHILE MEM[S].HH.LH>X DO BEGIN R:=S;S:=MEM[S].HH.RH;END;
IF MEM[S].HH.LH<>X THEN PWITHXBECOMI:=P ELSE BEGIN MEM[26001].HH.RH:=P;
MEM[R].HH.RH:=MEM[S].HH.RH;V:=MEM[S+1].INT;FREENODE(S,2);
PWITHXBECOMI:=PPLUSFQ(MEM[26001].HH.RH,V,Q,T,16);END;END;{:559}{563:}
PROCEDURE NEWDEP(Q,P:HALFWORD);VAR R:HALFWORD;BEGIN MEM[Q+1].HH.RH:=P;
MEM[Q+1].HH.LH:=13;R:=MEM[13].HH.RH;MEM[DEPFINAL].HH.RH:=R;
MEM[R+1].HH.LH:=DEPFINAL;MEM[13].HH.RH:=Q;END;{:563}{564:}
FUNCTION CONSTDEPENDE(V:SCALED):HALFWORD;BEGIN DEPFINAL:=GETNODE(2);
MEM[DEPFINAL+1].INT:=V;MEM[DEPFINAL].HH.LH:=0;CONSTDEPENDE:=DEPFINAL;
END;{:564}{565:}FUNCTION SINGLEDEPEND(P:HALFWORD):HALFWORD;
VAR Q:HALFWORD;
BEGIN IF MEM[P+1].INT>28 THEN SINGLEDEPEND:=CONSTDEPENDE(0)ELSE BEGIN Q
:=GETNODE(2);MEM[Q+1].INT:=TWOTOTHE[28-MEM[P+1].INT];MEM[Q].HH.LH:=P;
MEM[Q].HH.RH:=CONSTDEPENDE(0);SINGLEDEPEND:=Q;END;END;{:565}{566:}
FUNCTION COPYDEPLIST(P:HALFWORD):HALFWORD;LABEL 30;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);DEPFINAL:=Q;
WHILE TRUE DO BEGIN MEM[DEPFINAL].HH.LH:=MEM[P].HH.LH;
MEM[DEPFINAL+1].INT:=MEM[P+1].INT;IF MEM[DEPFINAL].HH.LH=0 THEN GOTO 30;
MEM[DEPFINAL].HH.RH:=GETNODE(2);DEPFINAL:=MEM[DEPFINAL].HH.RH;
P:=MEM[P].HH.RH;END;30:COPYDEPLIST:=Q;END;{:566}{567:}
PROCEDURE LINEAREQ(P:HALFWORD;T:SMALLNUMBER);VAR Q,R,S:HALFWORD;
X:HALFWORD;N:INTEGER;V:INTEGER;PREVR:HALFWORD;FINALNODE:HALFWORD;
W:INTEGER;BEGIN{568:}Q:=P;R:=MEM[P].HH.RH;V:=MEM[Q+1].INT;
WHILE MEM[R].HH.LH<>0 DO BEGIN IF ABS(MEM[R+1].INT)>ABS(V)THEN BEGIN Q:=
R;V:=MEM[R+1].INT;END;R:=MEM[R].HH.RH;END{:568};X:=MEM[Q].HH.LH;
N:=MEM[X+1].INT;{569:}S:=26001;MEM[S].HH.RH:=P;R:=P;
REPEAT IF R=Q THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN W:=MAKEFRACTION(MEM[R+1].INT,V);
IF ABS(W)<=1342 THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.RH;FREENODE(R,2);
END ELSE BEGIN MEM[R+1].INT:=-W;S:=R;END;END;R:=MEM[S].HH.RH;
UNTIL MEM[R].HH.LH=0;
IF T=17 THEN MEM[R+1].INT:=-MAKESCALED(MEM[R+1].INT,V)ELSE IF V<>
-268435456 THEN MEM[R+1].INT:=-MAKEFRACTION(MEM[R+1].INT,V);
FINALNODE:=R;P:=MEM[26001].HH.RH{:569};IF INTERNAL[2]>0 THEN{570:}
IF INTERESTING(X)THEN BEGIN BEGINDIAGNOS;PRINTNL(438);PRINTVARIABL(X);
W:=N;WHILE W>0 DO BEGIN PRINT(436);W:=W-2;END;PRINTCHAR(61);
PRINTDEPENDE(P,16);ENDDIAGNOSTI(FALSE);END{:570};{571:}PREVR:=13;
R:=MEM[13].HH.RH;WHILE R<>13 DO BEGIN S:=MEM[R+1].HH.RH;
Q:=PWITHXBECOMI(S,X,P,MEM[R].HH.B0);
IF MEM[Q].HH.LH=0 THEN MAKEKNOWN(R,Q)ELSE BEGIN MEM[R+1].HH.RH:=Q;
REPEAT Q:=MEM[Q].HH.RH;UNTIL MEM[Q].HH.LH=0;PREVR:=Q;END;
R:=MEM[PREVR].HH.RH;END{:571};{572:}IF N>0 THEN{573:}BEGIN S:=26001;
MEM[26001].HH.RH:=P;R:=P;
REPEAT IF N>30 THEN W:=0 ELSE W:=MEM[R+1].INT DIV TWOTOTHE[N];
IF(ABS(W)<=1342)AND(MEM[R].HH.LH<>0)THEN BEGIN MEM[S].HH.RH:=MEM[R].HH.
RH;FREENODE(R,2);END ELSE BEGIN MEM[R+1].INT:=W;S:=R;END;
R:=MEM[S].HH.RH;UNTIL MEM[S].HH.LH=0;P:=MEM[26001].HH.RH;END{:573};
IF MEM[P].HH.LH=0 THEN BEGIN MEM[X].HH.B0:=15;
MEM[X+1].INT:=MEM[P+1].INT;
IF ABS(MEM[X+1].INT)>=268435456 THEN ARITHERROR:=TRUE;FREENODE(P,2);
IF CUREXP=X THEN IF CURTYPE=19 THEN BEGIN CUREXP:=MEM[X+1].INT;
CURTYPE:=15;FREENODE(X,2);END;END ELSE BEGIN MEM[X].HH.B0:=16;
DEPFINAL:=FINALNODE;NEWDEP(X,P);
IF CUREXP=X THEN IF CURTYPE=19 THEN CURTYPE:=16;END{:572};
IF FIXNEEDED THEN FIXDEPENDENC;END;{:567}{576:}
FUNCTION NEWRINGENTRY(P:HALFWORD):HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(2);MEM[Q].HH.B1:=11;MEM[Q].HH.B0:=MEM[P].HH.B0;
IF MEM[P+1].INT=0 THEN MEM[Q+1].INT:=P ELSE MEM[Q+1].INT:=MEM[P+1].INT;
MEM[P+1].INT:=Q;NEWRINGENTRY:=Q;END;{:576}{578:}
PROCEDURE NONLINEAREQ(V:INTEGER;P:HALFWORD;FLUSHP:BOOLEAN);
VAR T:SMALLNUMBER;Q,R:HALFWORD;BEGIN T:=MEM[P].HH.B0-1;Q:=MEM[P+1].INT;
IF FLUSHP THEN MEM[P].HH.B0:=1 ELSE P:=Q;REPEAT R:=MEM[Q+1].INT;
MEM[Q].HH.B0:=T;CASE T OF 2:MEM[Q+1].INT:=V;4:BEGIN MEM[Q+1].INT:=V;
BEGIN IF STRREF[V]<127 THEN STRREF[V]:=STRREF[V]+1;END;END;
6:BEGIN MEM[Q+1].INT:=V;MEM[V].HH.LH:=MEM[V].HH.LH+1;END;
9:MEM[Q+1].INT:=COPYEDGES(V);11:MEM[Q+1].INT:=COPYPATH(V);END;Q:=R;
UNTIL Q=P;END;{:578}{579:}PROCEDURE RINGMERGE(P,Q:HALFWORD);LABEL 10;
VAR R:HALFWORD;BEGIN R:=MEM[P+1].INT;
WHILE R<>P DO BEGIN IF R=Q THEN BEGIN{580:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(441);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=442;HELPLINE[0]:=443;END;PUTGETERROR;
END{:580};GOTO 10;END;R:=MEM[R+1].INT;END;R:=MEM[P+1].INT;
MEM[P+1].INT:=MEM[Q+1].INT;MEM[Q+1].INT:=R;10:END;{:579}{583:}
PROCEDURE SHOWCMDMOD(C,M:INTEGER);BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTCMDMOD(C,M);PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END;{:583}{592:}
PROCEDURE SHOWCONTEXT;LABEL 30;VAR OLDSETTING:0..5;{597:}I:0..BUFSIZE;
L:0..HALFERRORLIN;M:INTEGER;N:0..ERRORLINE;P:INTEGER;Q:INTEGER;{:597}
BEGIN FILEPTR:=INPUTPTR;INPUTSTACK[FILEPTR]:=CURINPUT;
WHILE TRUE DO BEGIN CURINPUT:=INPUTSTACK[FILEPTR];{593:}
IF(FILEPTR=INPUTPTR)OR(CURINPUT.INDEXFIELD<=6)OR(CURINPUT.INDEXFIELD<>10
)OR(CURINPUT.LOCFIELD<>0)THEN BEGIN TALLY:=0;OLDSETTING:=SELECTOR;
IF(CURINPUT.INDEXFIELD<=6)THEN BEGIN{594:}
IF CURINPUT.NAMEFIELD<=1 THEN IF(CURINPUT.NAMEFIELD=0)AND(FILEPTR=0)THEN
PRINTNL(445)ELSE PRINTNL(446)ELSE BEGIN IF PAGE>1 THEN BEGIN PRINTNL(447
);PRINTINT(PAGE);PRINT(448);END ELSE PRINTNL(449);PRINTINT(LINE);END;
PRINTCHAR(32){:594};{600:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;
TRICKCOUNT:=1000000;END;
IF CURINPUT.LIMITFIELD>0 THEN FOR I:=CURINPUT.STARTFIELD TO CURINPUT.
LIMITFIELD-1 DO BEGIN IF I=CURINPUT.LOCFIELD THEN BEGIN FIRSTCOUNT:=
TALLY;TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;PRINT(BUFFER[I]);
END{:600};END ELSE BEGIN{595:}
CASE CURINPUT.INDEXFIELD OF 7:PRINTNL(450);8:PRINTNL(451);
10:IF CURINPUT.LOCFIELD=0 THEN PRINTNL(452)ELSE PRINTNL(453);
11:PRINTNL(454);12:BEGIN PRINTLN;
IF CURINPUT.NAMEFIELD<>0 THEN PRINT(HASH[CURINPUT.NAMEFIELD].RH)ELSE{596
:}BEGIN P:=PARAMSTACK[CURINPUT.LIMITFIELD];
IF P=0 THEN SHOWTOKENLIS(PARAMSTACK[CURINPUT.LIMITFIELD+1],0,1000)ELSE
BEGIN Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=PARAMSTACK[CURINPUT.LIMITFIELD+1];SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END{:596};PRINT(358);END;9:PRINTNL(455);
OTHERS:PRINTNL(63)END{:595};{601:}BEGIN L:=TALLY;TALLY:=0;SELECTOR:=4;
TRICKCOUNT:=1000000;END;
IF CURINPUT.INDEXFIELD<>12 THEN SHOWTOKENLIS(CURINPUT.STARTFIELD,
CURINPUT.LOCFIELD,100000)ELSE SHOWMACRO(CURINPUT.STARTFIELD,CURINPUT.
LOCFIELD,100000){:601};END;SELECTOR:=OLDSETTING;{599:}
IF TRICKCOUNT=1000000 THEN BEGIN FIRSTCOUNT:=TALLY;
TRICKCOUNT:=TALLY+1+ERRORLINE-HALFERRORLIN;
IF TRICKCOUNT<ERRORLINE THEN TRICKCOUNT:=ERRORLINE;END;
IF TALLY<TRICKCOUNT THEN M:=TALLY-FIRSTCOUNT ELSE M:=TRICKCOUNT-
FIRSTCOUNT;IF L+FIRSTCOUNT<=HALFERRORLIN THEN BEGIN P:=0;
N:=L+FIRSTCOUNT;END ELSE BEGIN PRINT(148);
P:=L+FIRSTCOUNT-HALFERRORLIN+3;N:=HALFERRORLIN;END;
FOR Q:=P TO FIRSTCOUNT-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
PRINTLN;FOR Q:=1 TO N DO PRINTCHAR(32);
IF M+N<=ERRORLINE THEN P:=FIRSTCOUNT+M ELSE P:=FIRSTCOUNT+(ERRORLINE-N-3
);FOR Q:=FIRSTCOUNT TO P-1 DO PRINTCHAR(TRICKBUF[Q MOD ERRORLINE]);
IF M+N>ERRORLINE THEN PRINT(148){:599};END{:593};
IF(CURINPUT.INDEXFIELD<=6)THEN IF(CURINPUT.NAMEFIELD>0)OR(FILEPTR=0)THEN
GOTO 30;FILEPTR:=FILEPTR-1;END;30:CURINPUT:=INPUTSTACK[INPUTPTR];END;
{:592}{605:}PROCEDURE BEGINTOKENLI(P:HALFWORD;T:QUARTERWORD);
BEGIN BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(456,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.STARTFIELD:=P;CURINPUT.INDEXFIELD:=T;
CURINPUT.LIMITFIELD:=PARAMPTR;CURINPUT.LOCFIELD:=P;END;{:605}{606:}
PROCEDURE ENDTOKENLIST;LABEL 30;VAR P:HALFWORD;
BEGIN IF CURINPUT.INDEXFIELD>=10 THEN IF CURINPUT.INDEXFIELD<=11 THEN
BEGIN FLUSHTOKENLI(CURINPUT.STARTFIELD);GOTO 30;
END ELSE DELETEMACREF(CURINPUT.STARTFIELD);
WHILE PARAMPTR>CURINPUT.LIMITFIELD DO BEGIN PARAMPTR:=PARAMPTR-1;
P:=PARAMSTACK[PARAMPTR];
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);END;30:BEGIN INPUTPTR:=INPUTPTR-1;
CURINPUT:=INPUTSTACK[INPUTPTR];END;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;END;{:606}{607:}
FUNCTION CURTOK:HALFWORD;VAR P:HALFWORD;
BEGIN IF CURSYM=0 THEN BEGIN P:=GETNODE(2);MEM[P+1].INT:=CURMOD;
MEM[P].HH.LH:=CURCMD;END ELSE BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
END;CURTOK:=P;END;{:607}{608:}PROCEDURE BACKINPUT;VAR P:HALFWORD;
S:0..150;BEGIN P:=CURTOK;
IF CURSYM<2244 THEN BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.
LOCFIELD=0)DO ENDTOKENLIST;BEGINTOKENLI(P,10);
END ELSE BEGIN S:=CURINPUT.LIMITFIELD;BEGINTOKENLI(P,10);
CURINPUT.LIMITFIELD:=S;END;END;{:608}{609:}PROCEDURE BACKERROR;
BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;OKTOINTERRUP:=TRUE;ERROR;END;
PROCEDURE INSERROR;BEGIN OKTOINTERRUP:=FALSE;BACKINPUT;
CURINPUT.INDEXFIELD:=11;OKTOINTERRUP:=TRUE;ERROR;END;{:609}{610:}
PROCEDURE BEGINFILEREA;BEGIN IF INOPEN=6 THEN OVERFLOW(457,6);
IF FIRST=BUFSIZE THEN OVERFLOW(128,BUFSIZE);INOPEN:=INOPEN+1;
BEGIN IF INPUTPTR>MAXINSTACK THEN BEGIN MAXINSTACK:=INPUTPTR;
IF INPUTPTR=STACKSIZE THEN OVERFLOW(456,STACKSIZE);END;
INPUTSTACK[INPUTPTR]:=CURINPUT;INPUTPTR:=INPUTPTR+1;END;
CURINPUT.INDEXFIELD:=INOPEN;LINESTACK[CURINPUT.INDEXFIELD]:=LINE;
CURINPUT.STARTFIELD:=FIRST;PAGESTACK[CURINPUT.INDEXFIELD]:=PAGE;
CURINPUT.NAMEFIELD:=0;END;{:610}{611:}PROCEDURE ENDFILEREADI;
BEGIN FIRST:=CURINPUT.STARTFIELD;PAGE:=PAGESTACK[CURINPUT.INDEXFIELD];
LINE:=LINESTACK[CURINPUT.INDEXFIELD];
IF CURINPUT.INDEXFIELD<>INOPEN THEN CONFUSION(458);
IF CURINPUT.NAMEFIELD>1 THEN ACLOSE(INPUTFILE[CURINPUT.INDEXFIELD]);
BEGIN INPUTPTR:=INPUTPTR-1;CURINPUT:=INPUTSTACK[INPUTPTR];END;
INOPEN:=INOPEN-1;END;{:611}{612:}PROCEDURE CLEARFORERRO;
BEGIN WHILE(CURINPUT.INDEXFIELD<=6)AND(CURINPUT.NAMEFIELD=0)AND(INPUTPTR
>0)AND(CURINPUT.LOCFIELD=CURINPUT.LIMITFIELD)DO ENDFILEREADI;PRINTLN;
BREAKIN(TTY,TRUE);END;{:612}{617:}FUNCTION CHECKOUTERVA:BOOLEAN;
VAR P:HALFWORD;
BEGIN IF SCANNERSTATU=0 THEN CHECKOUTERVA:=TRUE ELSE BEGIN DELETIONSALL
:=FALSE;{618:}IF CURSYM<>0 THEN BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;
BEGINTOKENLI(P,10);END{:618};IF SCANNERSTATU>1 THEN{619:}BEGIN RUNAWAY;
IF CURSYM=0 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(464);END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(465);END;END;PRINT(466);BEGIN HELPPTR:=4;
HELPLINE[3]:=467;HELPLINE[2]:=468;HELPLINE[1]:=469;HELPLINE[0]:=470;END;
CASE SCANNERSTATU OF{620:}2:BEGIN PRINT(471);HELPLINE[3]:=472;
CURSYM:=2235;END;3:BEGIN PRINT(473);HELPLINE[3]:=474;CURSYM:=2231;
EQTB[2231].RH:=WARNINGINFO;END;4,5:BEGIN PRINT(475);
IF SCANNERSTATU=5 THEN PRINT(HASH[WARNINGINFO].RH)ELSE PRINTVARIABL(
WARNINGINFO);CURSYM:=2237;END;6:BEGIN PRINT(476);
PRINT(HASH[WARNINGINFO].RH);PRINT(477);HELPLINE[3]:=478;CURSYM:=2236;
END;{:620}END;INSERROR;END{:619}
ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(459);END;PRINTINT(WARNINGINFO);BEGIN HELPPTR:=3;HELPLINE[2]:=460;
HELPLINE[1]:=461;HELPLINE[0]:=462;END;IF CURSYM=0 THEN HELPLINE[2]:=463;
CURSYM:=2238;INSERROR;END;DELETIONSALL:=TRUE;CHECKOUTERVA:=FALSE;END;
END;{:617}{622:}PROCEDURE FIRMUPTHELIN;FORWARD;{:622}{623:}
PROCEDURE GETNEXT;LABEL 20,10,40,25,85,86,87,30;VAR K:0..BUFSIZE;
C:ASCIICODE;CLASS:ASCIICODE;N,F:INTEGER;BEGIN 20:CURSYM:=0;
IF(CURINPUT.INDEXFIELD<=6)THEN{625:}
BEGIN 25:C:=BUFFER[CURINPUT.LOCFIELD];
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;CLASS:=CHARCLASS[C];
CASE CLASS OF 0:GOTO 85;
1:BEGIN CLASS:=CHARCLASS[BUFFER[CURINPUT.LOCFIELD]];
IF CLASS>1 THEN GOTO 25 ELSE IF CLASS<1 THEN BEGIN N:=0;GOTO 86;END;END;
2:GOTO 25;3:BEGIN{634:}IF CURINPUT.NAMEFIELD>1 THEN{636:}
BEGIN LINE:=LINE+1;FIRST:=CURINPUT.STARTFIELD;
IF NOT FORCEEOF THEN BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],
TRUE)THEN FIRMUPTHELIN ELSE FORCEEOF:=TRUE;END;
IF FORCEEOF THEN BEGIN PRINTCHAR(41);FORCEEOF:=FALSE;BREAK(TTY);
ENDFILEREADI;IF CHECKOUTERVA THEN GOTO 20 ELSE GOTO 20;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIRST:=CURINPUT.LIMITFIELD+1;
CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;END{:636}
ELSE BEGIN IF NOT(CURINPUT.NAMEFIELD=0)THEN BEGIN CURCMD:=56;CURMOD:=0;
CURSYM:=1;GOTO 10;END;IF INPUTPTR>0 THEN BEGIN ENDFILEREADI;GOTO 20;END;
IF SELECTOR<2 THEN OPENLOGFILE;
IF INTERACTION>1 THEN BEGIN IF CURINPUT.LIMITFIELD=CURINPUT.STARTFIELD
THEN PRINTNL(490);PRINTLN;FIRST:=CURINPUT.STARTFIELD;
BEGIN BEGIN IF INSKP0 THEN END;PRINT(42);TERMINPUT;END;
CURINPUT.LIMITFIELD:=LAST;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
END ELSE FATALERROR(491);END{:634};
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GOTO 25;END;4:{626:}
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=34 THEN CURMOD:=312 ELSE BEGIN K:=
CURINPUT.LOCFIELD;BUFFER[CURINPUT.LIMITFIELD+1]:=34;
REPEAT CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL BUFFER[CURINPUT.LOCFIELD]=34;
IF CURINPUT.LOCFIELD>CURINPUT.LIMITFIELD THEN{627:}
BEGIN CURINPUT.LOCFIELD:=CURINPUT.LIMITFIELD;
BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(483);END;
BEGIN HELPPTR:=3;HELPLINE[2]:=484;HELPLINE[1]:=485;HELPLINE[0]:=486;END;
DELETIONSALL:=FALSE;ERROR;DELETIONSALL:=TRUE;GOTO 20;END{:627};
IF CURINPUT.LOCFIELD=K+1 THEN CURMOD:=BUFFER[K]ELSE BEGIN BEGIN IF
POOLPTR+CURINPUT.LOCFIELD-K>MAXPOOLPTR THEN BEGIN IF POOLPTR+CURINPUT.
LOCFIELD-K>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
MAXPOOLPTR:=POOLPTR+CURINPUT.LOCFIELD-K;END;END;
REPEAT BEGIN STRPOOL[POOLPTR]:=BUFFER[K];POOLPTR:=POOLPTR+1;END;K:=K+1;
UNTIL K=CURINPUT.LOCFIELD;CURMOD:=MAKESTRING;END;END;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;CURCMD:=41;GOTO 10;END{:626};
5,6,7,8:BEGIN K:=CURINPUT.LOCFIELD-1;GOTO 40;END;OTHERS:END;
K:=CURINPUT.LOCFIELD-1;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=CLASS DO CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;GOTO 40;85:{628:}N:=C-48;
WHILE CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]=0 DO BEGIN IF N<4096 THEN N:=
10*N+BUFFER[CURINPUT.LOCFIELD]-48;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
IF BUFFER[CURINPUT.LOCFIELD]=46 THEN IF CHARCLASS[BUFFER[CURINPUT.
LOCFIELD+1]]=0 THEN GOTO 30;F:=0;GOTO 87;
30:CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1{:628};86:{629:}K:=0;
REPEAT IF K<17 THEN BEGIN DIG[K]:=BUFFER[CURINPUT.LOCFIELD]-48;K:=K+1;
END;CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;
UNTIL CHARCLASS[BUFFER[CURINPUT.LOCFIELD]]<>0;F:=ROUNDDECIMAL(K){:629};
87:{630:}
IF N<4096 THEN CURMOD:=N*65536+F ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(487);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=488;HELPLINE[0]:=489;END;DELETIONSALL:=FALSE;ERROR;
DELETIONSALL:=TRUE;CURMOD:=268435455;END;CURCMD:=40;GOTO 10{:630};
40:CURSYM:=IDLOOKUP(K,CURINPUT.LOCFIELD-K);END{:625}ELSE{631:}
IF CURINPUT.LOCFIELD>26000 THEN BEGIN CURSYM:=MEM[CURINPUT.LOCFIELD].HH.
LH;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
IF CURSYM>=2244 THEN IF CURSYM>=2544 THEN{632:}
BEGIN IF CURSYM>=2694 THEN CURSYM:=CURSYM-150;
BEGINTOKENLI(PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2544)],8);GOTO 20;
END{:632}ELSE BEGIN CURCMD:=37;
CURMOD:=PARAMSTACK[CURINPUT.LIMITFIELD+CURSYM-(2394)];GOTO 10;END;
END ELSE IF CURINPUT.LOCFIELD>0 THEN{633:}
BEGIN CURCMD:=MEM[CURINPUT.LOCFIELD].HH.LH;
CURMOD:=MEM[CURINPUT.LOCFIELD+1].INT;
IF CURCMD=41 THEN BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=
STRREF[CURMOD]+1;END;CURINPUT.LOCFIELD:=MEM[CURINPUT.LOCFIELD].HH.RH;
GOTO 10;END{:633}ELSE BEGIN ENDTOKENLIST;GOTO 20;END{:631};{624:}
CURCMD:=EQTB[CURSYM].LH;CURMOD:=EQTB[CURSYM].RH;
IF CURCMD>=82 THEN IF CHECKOUTERVA THEN CURCMD:=CURCMD-82 ELSE GOTO 20{:
624};10:END;{:623}{637:}PROCEDURE FIRMUPTHELIN;VAR K:0..BUFSIZE;
BEGIN CURINPUT.LIMITFIELD:=LAST;
IF INTERNAL[26]>0 THEN IF INTERACTION>1 THEN IF BUFFER[CURINPUT.
STARTFIELD]<>12 THEN BEGIN BEGIN IF INSKP0 THEN END;PRINTLN;
IF CURINPUT.STARTFIELD=CURINPUT.LIMITFIELD THEN BEGIN BUFFER[CURINPUT.
STARTFIELD]:=32;CURINPUT.LIMITFIELD:=CURINPUT.LIMITFIELD+1;END;
SELECTOR:=SELECTOR-1;
FOR K:=CURINPUT.STARTFIELD TO CURINPUT.LIMITFIELD-1 DO BEGIN PRINTCHAR(
BUFFER[K]);PTWR1W(0,ORD(XCHR[BUFFER[K]]));END;PRINT(492);
FIRST:=CURINPUT.STARTFIELD;IF NOT INPUTLN(TTY,TRUE)THEN FATALERROR(132);
IF LAST>FIRST THEN FOR K:=FIRST TO LAST-1 DO PRINTCHAR(BUFFER[K]);
CURINPUT.LIMITFIELD:=LAST;PRINTLN;SELECTOR:=SELECTOR+1;END;END;{:637}
{640:}FUNCTION SCANTOKS(TERMINATOR:COMMANDCODE;
SUBSTLIST,TAILEND:HALFWORD;SUFFIXCOUNT:SMALLNUMBER):HALFWORD;
LABEL 30,40;VAR P:HALFWORD;Q:HALFWORD;BALANCE:INTEGER;
PARAMSETTING:0..150;EXPRARGRENUM:BOOLEAN;BEGIN PARAMSETTING:=PARAMPTR;
EXPRARGRENUM:=FALSE;P:=26001;BALANCE:=1;MEM[26001].HH.RH:=0;
WHILE TRUE DO BEGIN GETNEXT;IF CURSYM>0 THEN IF CURSYM>=2244 THEN{642:}
IF TERMINATOR<>4 THEN BEGIN IF MEM[CURMOD].HH.B0=4 THEN BEGIN CURCMD:=41
;CURMOD:=MEM[CURMOD+1].INT;
BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END ELSE BEGIN IF MEM[CURMOD].HH.B0=15 THEN CURMOD:=MEM[CURMOD+1].INT
ELSE BEGIN DISPERR(CURMOD,501);BEGIN HELPPTR:=2;HELPLINE[1]:=502;
HELPLINE[0]:=503;END;ERROR;CURMOD:=0;END;CURCMD:=40;END;CURSYM:=0;
END ELSE BEGIN EXPRARGRENUM:=TRUE;
CURSYM:=CURSYM+CURINPUT.LIMITFIELD-PARAMPTR;END{:642}ELSE BEGIN{641:}
BEGIN Q:=SUBSTLIST;
WHILE Q<>0 DO BEGIN IF MEM[Q].HH.LH=CURSYM THEN BEGIN CURSYM:=MEM[Q+1].
INT;CURCMD:=7;GOTO 40;END;Q:=MEM[Q].HH.RH;END;40:END{:641};
IF CURCMD=TERMINATOR THEN{644:}
IF CURMOD>0 THEN BALANCE:=BALANCE+1 ELSE BEGIN BALANCE:=BALANCE-1;
IF BALANCE=0 THEN GOTO 30;END{:644}ELSE IF CURCMD=61 THEN{647:}
BEGIN IF CURMOD=0 THEN GETNEXT ELSE IF CURMOD<=SUFFIXCOUNT THEN CURSYM:=
2543+CURMOD;END{:647};END;MEM[P].HH.RH:=CURTOK;P:=MEM[P].HH.RH;END;
30:MEM[P].HH.RH:=TAILEND;FLUSHNODELIS(SUBSTLIST);
IF EXPRARGRENUM THEN{643:}
IF(CURINPUT.INDEXFIELD<=6)OR(PARAMPTR<>PARAMSETTING)THEN FATALERROR(504)
ELSE IF CURINPUT.LOCFIELD=0 THEN CURINPUT.LOCFIELD:=26003{:643};
SCANTOKS:=MEM[26001].HH.RH;END;{:640}{648:}PROCEDURE GETSYMBOL;LABEL 20;
BEGIN 20:GETNEXT;
IF(CURSYM=0)OR(CURSYM>2229)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(508);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=509;HELPLINE[1]:=510;HELPLINE[0]:=511;END;
IF CURSYM=0 THEN BACKINPUT ELSE HELPLINE[2]:=512;CURSYM:=2229;INSERROR;
GOTO 20;END;END;{:648}{649:}PROCEDURE GETCLEARSYMB;BEGIN GETSYMBOL;
CLEARSYMBOL(CURSYM,FALSE);END;{:649}{650:}PROCEDURE CHECKEQUALS;
BEGIN IF CURCMD<>50 THEN BEGIN MISSINGERR(61);BEGIN HELPPTR:=5;
HELPLINE[4]:=513;HELPLINE[3]:=514;HELPLINE[2]:=515;HELPLINE[1]:=516;
HELPLINE[0]:=517;END;BACKERROR;END;END;{:650}{651:}PROCEDURE MAKEOPDEF;
VAR M:COMMANDCODE;P,Q,R:HALFWORD;BEGIN M:=CURMOD;GETSYMBOL;
P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=2394;GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETSYMBOL;Q:=GETNODE(2);MEM[Q].HH.LH:=CURSYM;
MEM[Q+1].INT:=2395;MEM[P].HH.RH:=Q;GETNEXT;CHECKEQUALS;SCANNERSTATU:=5;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[R].HH.LH:=0;
MEM[R].HH.RH:=SCANTOKS(14,P,0,0);SCANNERSTATU:=0;
EQTB[WARNINGINFO].LH:=M;EQTB[WARNINGINFO].RH:=Q;GETNEXT;END;{:651}{654:}
{983:}PROCEDURE CHECKDELIMIT(LDELIM,RDELIM:HALFWORD);LABEL 10;
BEGIN IF CURCMD=62 THEN IF CURMOD=LDELIM THEN GOTO 10;
IF CURSYM<>RDELIM THEN BEGIN MISSINGERR(HASH[RDELIM].RH);
BEGIN HELPPTR:=2;HELPLINE[1]:=765;HELPLINE[0]:=766;END;BACKERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(767);END;PRINT(HASH[RDELIM].RH);PRINT(768);BEGIN HELPPTR:=3;
HELPLINE[2]:=769;HELPLINE[1]:=770;HELPLINE[0]:=771;END;ERROR;END;10:END;
{:983}{963:}FUNCTION SCANDECLARED:HALFWORD;LABEL 30;VAR X:HALFWORD;
H,T:HALFWORD;L:HALFWORD;BEGIN GETSYMBOL;X:=CURSYM;
IF CURCMD<>39 THEN CLEARSYMBOL(X,FALSE);IF EQTB[X].RH=0 THEN NEWROOT(X);
H:=GETAVAIL;MEM[H].HH.LH:=X;T:=H;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM=0 THEN GOTO 30;
IF CURCMD<>39 THEN IF CURCMD<>38 THEN IF CURCMD=52 THEN{964:}
BEGIN L:=CURSYM;GETNEXT;IF CURCMD<>63 THEN BEGIN BACKINPUT;CURSYM:=L;
CURCMD:=52;GOTO 30;END ELSE CURSYM:=0;END{:964}ELSE GOTO 30;
MEM[T].HH.RH:=GETAVAIL;T:=MEM[T].HH.RH;MEM[T].HH.LH:=CURSYM;END;
30:SCANDECLARED:=H;END;{:963}PROCEDURE SCANDEF;VAR M:1..2;N:0..3;
K:0..150;C:0..5;R:HALFWORD;Q:HALFWORD;P:HALFWORD;BASE:HALFWORD;
LDELIM,RDELIM:HALFWORD;BEGIN M:=CURMOD;C:=0;MEM[26001].HH.RH:=0;
Q:=GETAVAIL;MEM[Q].HH.LH:=0;R:=0;{656:}IF M=1 THEN BEGIN GETCLEARSYMB;
WARNINGINFO:=CURSYM;GETNEXT;SCANNERSTATU:=5;N:=0;
EQTB[WARNINGINFO].LH:=8;EQTB[WARNINGINFO].RH:=Q;
END ELSE BEGIN P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,TRUE);
WARNINGINFO:=FINDVARIABLE(P);FLUSHLIST(P);IF WARNINGINFO=0 THEN{657:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(524);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=525;HELPLINE[0]:=526;END;ERROR;
WARNINGINFO:=25;END{:657};SCANNERSTATU:=4;N:=2;
IF CURCMD=61 THEN IF CURMOD=3 THEN BEGIN N:=3;GETNEXT;END;
MEM[WARNINGINFO].HH.B0:=20+N;MEM[WARNINGINFO+1].INT:=Q;END{:656};K:=N;
IF CURCMD=30 THEN{659:}REPEAT LDELIM:=CURSYM;RDELIM:=CURMOD;GETNEXT;
IF(CURCMD=57)AND(CURMOD>=2394)THEN BASE:=CURMOD ELSE BEGIN BEGIN IF
INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(527);END;
BEGIN HELPPTR:=1;HELPLINE[0]:=528;END;BACKERROR;BASE:=2394;END;{660:}
REPEAT MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=BASE+K;
GETSYMBOL;P:=GETNODE(2);MEM[P+1].INT:=BASE+K;MEM[P].HH.LH:=CURSYM;
IF K=150 THEN OVERFLOW(529,150);K:=K+1;MEM[P].HH.RH:=R;R:=P;GETNEXT;
UNTIL CURCMD<>78{:660};CHECKDELIMIT(LDELIM,RDELIM);GETNEXT;
UNTIL CURCMD<>30{:659}ELSE IF CURCMD=57 THEN{661:}
IF CURMOD<=2394 THEN BEGIN P:=GETNODE(2);MEM[P+1].INT:=2394+N;
IF CURMOD<2394 THEN C:=CURMOD ELSE C:=4;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;IF C=4 THEN IF CURCMD=67 THEN BEGIN C:=5;
P:=GETNODE(2);MEM[P+1].INT:=2395+N;GETSYMBOL;MEM[P].HH.LH:=CURSYM;
MEM[P].HH.RH:=R;R:=P;GETNEXT;END;END{:661};CHECKEQUALS;P:=GETAVAIL;
MEM[P].HH.LH:=C;MEM[Q].HH.RH:=P;{655:}
IF M=1 THEN MEM[P].HH.RH:=SCANTOKS(14,R,0,N)ELSE BEGIN Q:=GETAVAIL;
MEM[Q].HH.LH:=2240;MEM[P].HH.RH:=Q;P:=GETAVAIL;MEM[P].HH.LH:=2241;
MEM[Q].HH.RH:=SCANTOKS(14,R,P,N);END;
IF WARNINGINFO=25 THEN FLUSHTOKENLI(MEM[26].INT){:655};SCANNERSTATU:=0;
GETNEXT;END;{:654}{662:}PROCEDURE READTOKS;VAR M:HALFWORD;P:HALFWORD;
Q:HALFWORD;BEGIN GETCLEARSYMB;M:=CURSYM;
IF INTERACTION<=1 THEN FATALERROR(530);BEGINFILEREA;
CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;PRINT(312);
TERMINPUT;END;CURINPUT.LIMITFIELD:=LAST;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
P:=GETAVAIL;MEM[P].HH.LH:=0;Q:=GETAVAIL;MEM[P].HH.RH:=Q;MEM[Q].HH.LH:=0;
MEM[Q].HH.RH:=SCANTOKS(56,0,0,0);EQTB[M].LH:=8;EQTB[M].RH:=P;
ENDFILEREADI;GETNEXT;END;{:662}{663:}PROCEDURE SCANPRIMARY;FORWARD;
PROCEDURE SCANSECONDAR;FORWARD;PROCEDURE SCANTERTIARY;FORWARD;
PROCEDURE SCANEXPRESSI;FORWARD;PROCEDURE SCANSUFFIX;FORWARD;{674:}{676:}
PROCEDURE PRINTMACRONA(A,N:HALFWORD);VAR P,Q:HALFWORD;
BEGIN IF N<>0 THEN PRINT(HASH[N].RH)ELSE BEGIN P:=MEM[A].HH.LH;
IF P=0 THEN PRINT(HASH[MEM[MEM[MEM[A].HH.RH].HH.LH].HH.LH].RH)ELSE BEGIN
Q:=P;WHILE MEM[Q].HH.RH<>0 DO Q:=MEM[Q].HH.RH;
MEM[Q].HH.RH:=MEM[MEM[A].HH.RH].HH.LH;SHOWTOKENLIS(P,0,1000);
MEM[Q].HH.RH:=0;END;END;END;{:676}{677:}PROCEDURE PRINTARG(Q:HALFWORD;
N:INTEGER;B:HALFWORD);
BEGIN IF MEM[Q].HH.RH=1 THEN PRINTNL(355)ELSE IF B<2694 THEN PRINTNL(356
)ELSE PRINTNL(357);PRINTINT(N);PRINT(543);
IF MEM[Q].HH.RH=1 THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,1000);END;
{:677}PROCEDURE MACROCALL(DEFREF,ARGLIST,MACRONAME:HALFWORD);
LABEL 40,30;VAR R:HALFWORD;P,Q:HALFWORD;N:INTEGER;
LDELIM,RDELIM:HALFWORD;BALANCE:INTEGER;TAIL:HALFWORD;
PARAMSETTING:0..150;EXPRARGRENUM:BOOLEAN;BEGIN R:=MEM[DEFREF].HH.RH;
MEM[DEFREF].HH.LH:=MEM[DEFREF].HH.LH+1;IF ARGLIST=0 THEN N:=0 ELSE{678:}
BEGIN N:=1;TAIL:=ARGLIST;WHILE MEM[TAIL].HH.RH<>0 DO BEGIN N:=N+1;
TAIL:=MEM[TAIL].HH.RH;END;END{:678};IF INTERNAL[7]>0 THEN{675:}
BEGIN BEGINDIAGNOS;PRINTLN;PRINTMACRONA(ARGLIST,MACRONAME);
IF N=3 THEN PRINT(507);SHOWMACRO(DEFREF,0,1000);
IF ARGLIST<>0 THEN BEGIN N:=0;P:=ARGLIST;REPEAT Q:=MEM[P].HH.LH;
PRINTARG(Q,N,0);N:=N+1;P:=MEM[P].HH.RH;UNTIL P=0;END;
ENDDIAGNOSTI(FALSE);END{:675};{679:}CURCMD:=79;
WHILE MEM[R].HH.LH>=2394 DO BEGIN{680:}
IF CURCMD<>78 THEN BEGIN GETXNEXT;
IF CURCMD<>30 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(549);END;PRINTMACRONA(ARGLIST,MACRONAME);
BEGIN HELPPTR:=3;HELPLINE[2]:=550;HELPLINE[1]:=551;HELPLINE[0]:=552;END;
IF MEM[R].HH.LH>=2544 THEN BEGIN CUREXP:=0;CURTYPE:=20;
END ELSE BEGIN CUREXP:=0;CURTYPE:=15;END;BACKERROR;CURCMD:=62;GOTO 40;
END;LDELIM:=CURSYM;RDELIM:=CURMOD;END;{683:}
IF MEM[R].HH.LH>=2694 THEN{684:}BEGIN WARNINGINFO:=LDELIM;
SCANNERSTATU:=3;PARAMSETTING:=PARAMPTR;EXPRARGRENUM:=FALSE;P:=26001;
BALANCE:=1;MEM[26001].HH.RH:=0;WHILE TRUE DO BEGIN GETNEXT;
IF CURSYM>=2244 THEN{686:}
IF MEM[CURMOD].HH.B0=4 THEN BEGIN CURMOD:=MEM[CURMOD+1].INT;CURCMD:=41;
CURSYM:=0;
BEGIN IF STRREF[CURMOD]<127 THEN STRREF[CURMOD]:=STRREF[CURMOD]+1;END;
END ELSE IF(MEM[CURMOD].HH.B0<>15)AND(MEM[MEM[R].HH.RH].HH.LH=0)THEN
BEGIN EXPRARGRENUM:=TRUE;
CURSYM:=CURSYM+CURINPUT.LIMITFIELD-PARAMPTR-N-1;END ELSE{687:}
BEGIN IF MEM[CURMOD].HH.B0=15 THEN CURMOD:=MEM[CURMOD+1].INT ELSE BEGIN
DISPERR(CURMOD,556);BEGIN HELPPTR:=3;HELPLINE[2]:=557;HELPLINE[1]:=558;
HELPLINE[0]:=559;END;ERROR;CURMOD:=0;END;CURSYM:=0;CURCMD:=40;END{:687}
{:686}ELSE IF CURCMD=62 THEN BEGIN IF CURMOD=LDELIM THEN BEGIN BALANCE:=
BALANCE-1;IF BALANCE=0 THEN GOTO 30;END;
END ELSE IF CURCMD=30 THEN IF CURMOD=RDELIM THEN BALANCE:=BALANCE+1;
MEM[P].HH.RH:=CURTOK;P:=MEM[P].HH.RH;END;30:CUREXP:=MEM[26001].HH.RH;
CURTYPE:=20;SCANNERSTATU:=0;IF EXPRARGRENUM THEN{688:}
IF(CURINPUT.INDEXFIELD<=6)OR(PARAMPTR<>PARAMSETTING)THEN FATALERROR(560)
ELSE IF CURINPUT.LOCFIELD=0 THEN CURINPUT.LOCFIELD:=26003{:688};
END{:684}ELSE BEGIN GETXNEXT;
IF MEM[R].HH.LH>=2544 THEN SCANSUFFIX ELSE SCANEXPRESSI;END{:683};
IF CURCMD<>78 THEN{681:}
IF(CURCMD<>62)OR(CURMOD<>LDELIM)THEN IF MEM[MEM[R].HH.RH].HH.LH>=2394
THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=3;HELPLINE[2]:=553;
HELPLINE[1]:=554;HELPLINE[0]:=548;END;BACKERROR;CURCMD:=78;
END ELSE BEGIN MISSINGERR(HASH[RDELIM].RH);BEGIN HELPPTR:=2;
HELPLINE[1]:=555;HELPLINE[0]:=548;END;BACKERROR;END{:681};40:{682:}
BEGIN P:=GETAVAIL;
IF CURTYPE=20 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:682}{:680};R:=MEM[R].HH.RH;END;
IF CURCMD=78 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(544);END;PRINTMACRONA(ARGLIST,MACRONAME);
PRINTCHAR(59);PRINTNL(545);PRINT(HASH[RDELIM].RH);PRINT(171);
BEGIN HELPPTR:=3;HELPLINE[2]:=546;HELPLINE[1]:=547;HELPLINE[0]:=548;END;
ERROR;END;IF MEM[R].HH.LH<>0 THEN{689:}BEGIN GETXNEXT;
IF(CURCMD=50)OR(CURCMD=76)THEN GETXNEXT;
CASE MEM[R].HH.LH OF 1:SCANPRIMARY;2:SCANSECONDAR;3:SCANTERTIARY;
4:SCANEXPRESSI;5:BEGIN SCANEXPRESSI;P:=GETAVAIL;
MEM[P].HH.LH:=STASHCUREXP;IF INTERNAL[7]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,0);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
IF CURCMD<>67 THEN BEGIN MISSINGERR(339);PRINT(561);
PRINTMACRONA(ARGLIST,MACRONAME);BEGIN HELPPTR:=1;HELPLINE[0]:=562;END;
BACKERROR;END;GETXNEXT;SCANPRIMARY;END;END;BACKINPUT;{682:}
BEGIN P:=GETAVAIL;
IF CURTYPE=20 THEN MEM[P].HH.LH:=CUREXP ELSE MEM[P].HH.LH:=STASHCUREXP;
IF INTERNAL[7]>0 THEN BEGIN BEGINDIAGNOS;
PRINTARG(MEM[P].HH.LH,N,MEM[R].HH.LH);ENDDIAGNOSTI(FALSE);END;
IF ARGLIST=0 THEN ARGLIST:=P ELSE MEM[TAIL].HH.RH:=P;TAIL:=P;N:=N+1;
END{:682};END{:689};R:=MEM[R].HH.RH{:679};{690:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF PARAMPTR+N>MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=PARAMPTR+N;
IF MAXPARAMSTAC>150 THEN OVERFLOW(529,150);END;BEGINTOKENLI(DEFREF,12);
CURINPUT.NAMEFIELD:=MACRONAME;CURINPUT.LOCFIELD:=R;
IF N>0 THEN BEGIN P:=ARGLIST;REPEAT PARAMSTACK[PARAMPTR]:=MEM[P].HH.LH;
PARAMPTR:=PARAMPTR+1;P:=MEM[P].HH.RH;UNTIL P=0;FLUSHLIST(ARGLIST);
END{:690};END;{:674}PROCEDURE GETBOOLEAN;FORWARD;PROCEDURE PASSTEXT;
FORWARD;PROCEDURE CONDITIONAL;FORWARD;PROCEDURE STARTINPUT;FORWARD;
PROCEDURE BEGINITERATI;FORWARD;PROCEDURE RESUMEITERAT;FORWARD;
PROCEDURE STOPITERATIO;FORWARD;{:663}{664:}PROCEDURE GETXNEXT;
VAR P:HALFWORD;SAVEEXP:HALFWORD;BEGIN GETNEXT;
IF CURCMD<9 THEN BEGIN SAVEEXP:=STASHCUREXP;REPEAT{665:}
BEGIN IF INTERNAL[6]>65536 THEN IF CURCMD<>8 THEN SHOWCMDMOD(CURCMD,
CURMOD);CASE CURCMD OF 1:CONDITIONAL;2:{705:}
IF CURMOD>IFLIMIT THEN IF IFLIMIT=1 THEN BEGIN MISSINGERR(58);BACKINPUT;
CURSYM:=2234;INSERROR;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(569);END;PRINTCMDMOD(2,CURMOD);BEGIN HELPPTR:=1;HELPLINE[0]:=570;
END;ERROR;END ELSE BEGIN WHILE CURMOD<>2 DO PASSTEXT;{699:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:699};
END{:705};3:{669:}IF CURMOD>0 THEN FORCEEOF:=TRUE ELSE STARTINPUT{:669};
4:IF CURMOD=0 THEN{666:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(531);END;BEGIN HELPPTR:=2;HELPLINE[1]:=532;
HELPLINE[0]:=533;END;ERROR;END{:666}ELSE BEGINITERATI;5:{670:}
BEGIN WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO
ENDTOKENLIST;
IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(535);END;BEGIN HELPPTR:=2;HELPLINE[1]:=536;
HELPLINE[0]:=537;END;ERROR;END ELSE RESUMEITERAT;END{:670};6:{671:}
BEGIN GETBOOLEAN;IF INTERNAL[6]>65536 THEN SHOWCMDMOD(32,CUREXP);
IF CUREXP=30 THEN IF LOOPPTR=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(538);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=539;END;IF CURCMD=79 THEN ERROR ELSE BACKERROR;
END ELSE{672:}BEGIN P:=0;
REPEAT IF(CURINPUT.INDEXFIELD<=6)THEN ENDFILEREADI ELSE BEGIN IF
CURINPUT.INDEXFIELD=7 THEN P:=CURINPUT.STARTFIELD;ENDTOKENLIST;END;
UNTIL P<>0;IF P<>MEM[LOOPPTR].HH.LH THEN FATALERROR(542);STOPITERATIO;
END{:672}ELSE IF CURCMD<>79 THEN BEGIN MISSINGERR(59);BEGIN HELPPTR:=2;
HELPLINE[1]:=540;HELPLINE[0]:=541;END;BACKERROR;END;END{:671};7:;
8:MACROCALL(CURMOD,0,CURSYM);END;END{:665};GETNEXT;UNTIL CURCMD>=9;
UNSTASHCUREX(SAVEEXP);END;END;{:664}{691:}
PROCEDURE STACKARGUMEN(P:HALFWORD);
BEGIN IF PARAMPTR=MAXPARAMSTAC THEN BEGIN MAXPARAMSTAC:=MAXPARAMSTAC+1;
IF MAXPARAMSTAC>150 THEN OVERFLOW(529,150);END;PARAMSTACK[PARAMPTR]:=P;
PARAMPTR:=PARAMPTR+1;END;{:691}{696:}PROCEDURE PASSTEXT;LABEL 30;
VAR L:INTEGER;BEGIN SCANNERSTATU:=1;L:=0;WARNINGINFO:=LINE;
WHILE TRUE DO BEGIN GETNEXT;
IF CURCMD<=2 THEN IF CURCMD<2 THEN L:=L+1 ELSE BEGIN IF L=0 THEN GOTO 30
;IF CURMOD=2 THEN L:=L-1;END ELSE{697:}
IF CURCMD=41 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:697}
;END;30:SCANNERSTATU:=0;END;{:696}{700:}
PROCEDURE CHANGEIFLIMI(L:SMALLNUMBER;P:HALFWORD);LABEL 10;
VAR Q:HALFWORD;BEGIN IF P=CONDPTR THEN IFLIMIT:=L ELSE BEGIN Q:=CONDPTR;
WHILE TRUE DO BEGIN IF Q=0 THEN CONFUSION(563);
IF MEM[Q].HH.RH=P THEN BEGIN MEM[Q].HH.B0:=L;GOTO 10;END;
Q:=MEM[Q].HH.RH;END;END;10:END;{:700}{701:}PROCEDURE CHECKCOLON;
BEGIN IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=2;
HELPLINE[1]:=566;HELPLINE[0]:=541;END;BACKERROR;END;END;{:701}{702:}
PROCEDURE CONDITIONAL;LABEL 10,30,21,40;VAR SAVECONDPTR:HALFWORD;
NEWIFLIMIT:2..4;P:HALFWORD;BEGIN{698:}BEGIN P:=GETNODE(2);
MEM[P].HH.RH:=CONDPTR;MEM[P].HH.B0:=IFLIMIT;MEM[P].HH.B1:=CURIF;
MEM[P+1].INT:=IFLINE;CONDPTR:=P;IFLIMIT:=1;IFLINE:=LINE;CURIF:=1;
END{:698};SAVECONDPTR:=CONDPTR;21:GETBOOLEAN;NEWIFLIMIT:=4;
IF INTERNAL[6]>65536 THEN{704:}BEGIN BEGINDIAGNOS;
IF CUREXP=30 THEN PRINT(567)ELSE PRINT(568);ENDDIAGNOSTI(FALSE);
END{:704};40:CHECKCOLON;
IF CUREXP=30 THEN BEGIN CHANGEIFLIMI(NEWIFLIMIT,SAVECONDPTR);GOTO 10;
END;{703:}WHILE TRUE DO BEGIN PASSTEXT;
IF CONDPTR=SAVECONDPTR THEN GOTO 30 ELSE IF CURMOD=2 THEN{699:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:699};
END{:703};30:CURIF:=CURMOD;IFLINE:=LINE;IF CURMOD=2 THEN{699:}
BEGIN P:=CONDPTR;IFLINE:=MEM[P+1].INT;CURIF:=MEM[P].HH.B1;
IFLIMIT:=MEM[P].HH.B0;CONDPTR:=MEM[P].HH.RH;FREENODE(P,2);END{:699}
ELSE IF CURMOD=4 THEN GOTO 21 ELSE BEGIN CUREXP:=30;NEWIFLIMIT:=2;
GETXNEXT;GOTO 40;END;10:END;{:702}{707:}PROCEDURE BADFOR(S:STRNUMBER);
BEGIN DISPERR(0,571);PRINT(S);PRINT(178);BEGIN HELPPTR:=4;
HELPLINE[3]:=572;HELPLINE[2]:=573;HELPLINE[1]:=574;HELPLINE[0]:=180;END;
PUTGETFLUSHE(0);END;{:707}{708:}PROCEDURE BEGINITERATI;LABEL 30,40;
VAR M:HALFWORD;N:HALFWORD;P,Q,S,PP:HALFWORD;BEGIN M:=CURMOD;N:=CURSYM;
S:=GETNODE(2);IF M=1 THEN BEGIN MEM[S+1].HH.LH:=1;P:=0;GETNEXT;GOTO 40;
END;GETSYMBOL;P:=GETNODE(2);MEM[P].HH.LH:=CURSYM;MEM[P+1].INT:=M;
GETNEXT;IF(CURCMD<>50)AND(CURCMD<>76)THEN BEGIN MISSINGERR(61);
BEGIN HELPPTR:=3;HELPLINE[2]:=575;HELPLINE[1]:=515;HELPLINE[0]:=576;END;
BACKERROR;END;{717:}Q:=S+1;REPEAT GETXNEXT;
IF M<>2394 THEN SCANSUFFIX ELSE BEGIN SCANEXPRESSI;
IF CURCMD=73 THEN IF Q=S+1 THEN{718:}
BEGIN IF CURTYPE<>15 THEN BADFOR(582);PP:=GETNODE(4);
MEM[PP+1].INT:=CUREXP;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BADFOR(583);MEM[PP+2].INT:=CUREXP;
IF CURCMD<>74 THEN BEGIN MISSINGERR(348);BEGIN HELPPTR:=2;
HELPLINE[1]:=584;HELPLINE[0]:=585;END;BACKERROR;END;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN BADFOR(586);MEM[PP+3].INT:=CUREXP;
MEM[S+1].HH.LH:=PP;GOTO 30;END{:718};CUREXP:=STASHCUREXP;END;
MEM[Q].HH.RH:=GETAVAIL;Q:=MEM[Q].HH.RH;MEM[Q].HH.LH:=CUREXP;CURTYPE:=1;
UNTIL CURCMD<>78;MEM[S+1].HH.LH:=0;30:{:717};40:{709:}
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=3;
HELPLINE[2]:=577;HELPLINE[1]:=578;HELPLINE[0]:=579;END;BACKERROR;
END{:709};{711:}Q:=GETAVAIL;MEM[Q].HH.LH:=2230;SCANNERSTATU:=6;
WARNINGINFO:=N;MEM[S].HH.LH:=SCANTOKS(4,P,Q,0);SCANNERSTATU:=0;
MEM[S].HH.RH:=LOOPPTR;LOOPPTR:=S{:711};RESUMEITERAT;END;{:708}{713:}
PROCEDURE RESUMEITERAT;LABEL 45,10;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;IF P>1 THEN BEGIN CUREXP:=MEM[P+1].INT;
IF{714:}
((MEM[P+2].INT>0)AND(CUREXP>MEM[P+3].INT))OR((MEM[P+2].INT<0)AND(CUREXP<
MEM[P+3].INT)){:714}THEN GOTO 45;CURTYPE:=15;Q:=STASHCUREXP;
MEM[P+1].INT:=CUREXP+MEM[P+2].INT;
END ELSE IF P<1 THEN BEGIN P:=MEM[LOOPPTR+1].HH.RH;IF P=0 THEN GOTO 45;
MEM[LOOPPTR+1].HH.RH:=MEM[P].HH.RH;Q:=MEM[P].HH.LH;
BEGIN MEM[P].HH.RH:=AVAIL;AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;
BEGINTOKENLI(MEM[LOOPPTR].HH.LH,7);IF P<>1 THEN STACKARGUMEN(Q);
IF INTERNAL[6]>65536 THEN{715:}IF P<>1 THEN BEGIN BEGINDIAGNOS;
PRINTNL(581);
IF(Q<>0)AND(MEM[Q].HH.RH=1)THEN PRINTEXP(Q,1)ELSE SHOWTOKENLIS(Q,0,50);
PRINTCHAR(125);ENDDIAGNOSTI(FALSE);END{:715};GOTO 10;45:STOPITERATIO;
10:END;{:713}{716:}PROCEDURE STOPITERATIO;VAR P,Q:HALFWORD;
BEGIN P:=MEM[LOOPPTR+1].HH.LH;
IF P>1 THEN FREENODE(P,4)ELSE IF P<1 THEN BEGIN Q:=MEM[LOOPPTR+1].HH.RH;
WHILE Q<>0 DO BEGIN P:=MEM[Q].HH.LH;
IF P<>0 THEN IF MEM[P].HH.RH=1 THEN BEGIN RECYCLEVALUE(P);FREENODE(P,2);
END ELSE FLUSHTOKENLI(P);P:=Q;Q:=MEM[Q].HH.RH;BEGIN MEM[P].HH.RH:=AVAIL;
AVAIL:=P;DYNUSED:=DYNUSED-1;END;END;END;P:=LOOPPTR;
LOOPPTR:=MEM[P].HH.RH;FLUSHTOKENLI(MEM[P].HH.LH);FREENODE(P,2);END;
{:716}{723:}PROCEDURE BEGINNAME;BEGIN AREADELIMITE:=0;EXTDELIMITER:=0;
END;{:723}{724:}FUNCTION MORENAME(C:ASCIICODE):BOOLEAN;
BEGIN IF C=32 THEN MORENAME:=FALSE ELSE BEGIN IF C=91 THEN AREADELIMITE
:=POOLPTR ELSE IF C=46 THEN EXTDELIMITER:=POOLPTR;
BEGIN IF POOLPTR+1>MAXPOOLPTR THEN BEGIN IF POOLPTR+1>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+1;END;END;
BEGIN STRPOOL[POOLPTR]:=C;POOLPTR:=POOLPTR+1;END;MORENAME:=TRUE;END;END;
{:724}{725:}PROCEDURE ENDNAME;
BEGIN IF STRPTR+3>MAXSTRPTR THEN BEGIN IF STRPTR+3>MAXSTRINGS THEN
OVERFLOW(130,MAXSTRINGS-INITSTRPTR);MAXSTRPTR:=STRPTR+3;END;
CURNAME:=STRPTR;
IF EXTDELIMITER=0 THEN CUREXT:=312 ELSE BEGIN STRPTR:=STRPTR+1;
STRSTART[STRPTR]:=EXTDELIMITER;CUREXT:=STRPTR;END;
IF AREADELIMITE<=STRSTART[STRPTR]THEN BEGIN CURAREA:=312;
STRPTR:=STRPTR+1;STRSTART[STRPTR]:=POOLPTR;
END ELSE BEGIN STRPTR:=STRPTR+1;STRSTART[STRPTR]:=AREADELIMITE;
CURAREA:=MAKESTRING;END;END;{:725}{727:}
PROCEDURE PACKFILENAME(N,A,E:STRNUMBER);VAR K:INTEGER;C:ASCIICODE;
J:POOLPOINTER;BEGIN K:=0;
IF(E=588)AND((STRSTART[N+1]-STRSTART[N])>6)THEN BEGIN FOR J:=STRSTART[N]
TO STRSTART[N]+2 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[N+1]-3 TO STRSTART[N+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
END ELSE FOR J:=STRSTART[N]TO STRSTART[N+1]-1 DO BEGIN C:=STRPOOL[J];
K:=K+1;IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[E]TO STRSTART[E+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN C:=STRPOOL[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:727}
{731:}PROCEDURE PACKBUFFERED(N:SMALLNUMBER;A,B:INTEGER);VAR K:INTEGER;
C:ASCIICODE;J:INTEGER;D:INTEGER;
BEGIN IF N+B-A+5>FILENAMESIZE THEN B:=A+FILENAMESIZE-N-5;K:=0;
FOR J:=A TO B DO BEGIN C:=BUFFER[J];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF B=0 THEN BEGIN D:=10;N:=18;END ELSE D:=6;
FOR J:=D TO 9 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
FOR J:=18-N+1 TO 18 DO BEGIN C:=XORD[MFBASEDEFAUL[J]];K:=K+1;
IF(C>=97)AND(C<=122)THEN C:=C-32;
IF K<=FILENAMESIZE THEN NAMEOFFILE[K]:=XCHR[C];END;
IF K<=FILENAMESIZE THEN NAMELENGTH:=K ELSE NAMELENGTH:=FILENAMESIZE;
FOR K:=NAMELENGTH+1 TO FILENAMESIZE DO NAMEOFFILE[K]:=' ';END;{:731}
{733:}PROCEDURE CURNAM(VAR CHAN:FILE;VAR S:STRING);EXTERN;
FUNCTION MAKENAMESTRI(VAR F:FILE):STRNUMBER;
VAR S:PACKED ARRAY[1..24]OF CHAR;K:1..24;BEGIN CURNAM(F,S);
BEGIN IF POOLPTR+24>MAXPOOLPTR THEN BEGIN IF POOLPTR+24>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+24;END;END;K:=1;
WHILE ORD(S[K])<>0 DO BEGIN BEGIN STRPOOL[POOLPTR]:=XORD[S[K]];
POOLPTR:=POOLPTR+1;END;K:=K+1;END;MAKENAMESTRI:=MAKESTRING;END;
FUNCTION AMAKENAMESTR(VAR F:ALPHAFILE):STRNUMBER;
BEGIN AMAKENAMESTR:=MAKENAMESTRI(F);END;
FUNCTION BMAKENAMESTR(VAR F:BYTEFILE):STRNUMBER;
BEGIN BMAKENAMESTR:=MAKENAMESTRI(F);END;
FUNCTION WMAKENAMESTR(VAR F:WORDFILE):STRNUMBER;
BEGIN WMAKENAMESTR:=MAKENAMESTRI(F);END;{:733}{734:}
PROCEDURE SCANFILENAME;LABEL 30;BEGIN BEGINNAME;
WHILE BUFFER[CURINPUT.LOCFIELD]=32 DO CURINPUT.LOCFIELD:=CURINPUT.
LOCFIELD+1;
WHILE TRUE DO BEGIN IF(BUFFER[CURINPUT.LOCFIELD]=59)OR(BUFFER[CURINPUT.
LOCFIELD]=37)THEN GOTO 30;
IF NOT MORENAME(BUFFER[CURINPUT.LOCFIELD])THEN GOTO 30;
CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;30:ENDNAME;END;{:734}{737:}
PROCEDURE PACKJOBNAME(S:STRNUMBER);BEGIN CURAREA:=312;CUREXT:=S;
CURNAME:=JOBNAME;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;{:737}{738:}
PROCEDURE PROMPTFILENA(S,E:STRNUMBER);LABEL 30;VAR K:0..BUFSIZE;
I:POOLPOINTER;BEGIN IF INTERACTION=2 THEN WAKEUPTERMIN;
IF S=589 THEN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(590);END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(591);END;PRINTFILENAM(CURNAME,CURAREA,CUREXT);
PRINT(592);IF E=593 THEN SHOWCONTEXT;PRINTNL(594);PRINT(S);
IF INTERACTION<2 THEN FATALERROR(595);BREAKIN(TTY,TRUE);
FOR I:=STRSTART[CURNAME]TO STRSTART[CURNAME+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CUREXT]TO STRSTART[CUREXT+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));
FOR I:=STRSTART[CURAREA]TO STRSTART[CURAREA+1]-1 DO PTWR1W(0,ORD(XCHR[
STRPOOL[I]]));PTWR1W(0,140);BEGIN BEGIN IF INSKP0 THEN END;PRINT(596);
TERMINPUT;END;{739:}BEGIN BEGINNAME;K:=FIRST;
WHILE(BUFFER[K]=32)AND(K<LAST)DO K:=K+1;
WHILE TRUE DO BEGIN IF K=LAST THEN GOTO 30;
IF NOT MORENAME(BUFFER[K])THEN GOTO 30;K:=K+1;END;30:ENDNAME;END{:739};
IF CUREXT=312 THEN CUREXT:=E;PACKFILENAME(CURNAME,CURAREA,CUREXT);END;
{:738}{740:}PROCEDURE OPENLOGFILE;VAR OLDSETTING:0..5;K:0..BUFSIZE;
L:0..BUFSIZE;M:INTEGER;MONTHS:PACKED ARRAY[1..36]OF CHAR;
BEGIN OLDSETTING:=SELECTOR;IF JOBNAME=0 THEN JOBNAME:=597;
PACKJOBNAME(598);WHILE NOT AOPENOUT(LOGFILE)DO{741:}
BEGIN IF INTERACTION<2 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(591);END;
PRINTFILENAM(CURNAME,CURAREA,CUREXT);PRINT(592);JOBNAME:=0;HISTORY:=3;
JUMPOUT;END;PROMPTFILENA(600,598);END{:741};
LOGNAME:=AMAKENAMESTR(LOGFILE);SELECTOR:=2;{742:}
BEGIN WRITE(LOGFILE,'This is METAFONT, WAITS Version 0.3');
PRINT(BASEIDENT);PRINT(601);PRINTINT(ROUNDUNSCALE(INTERNAL[14]));
PRINTCHAR(32);MONTHS:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
M:=ROUNDUNSCALE(INTERNAL[13]);
FOR K:=3*M-2 TO 3*M DO WRITE(LOGFILE,MONTHS[K]);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[12]));PRINTCHAR(32);
M:=ROUNDUNSCALE(INTERNAL[15]);PRINTDD(M DIV 60);PRINTCHAR(58);
PRINTDD(M MOD 60);END{:742};INPUTSTACK[INPUTPTR]:=CURINPUT;PRINTNL(599);
L:=INPUTSTACK[0].LIMITFIELD-1;FOR K:=1 TO L DO PRINT(BUFFER[K]);PRINTLN;
SELECTOR:=OLDSETTING+2;END;{:740}{745:}PROCEDURE STARTINPUT;LABEL 30;
BEGIN{747:}
WHILE(CURINPUT.INDEXFIELD>6)AND(CURINPUT.LOCFIELD=0)DO ENDTOKENLIST;
IF(CURINPUT.INDEXFIELD>6)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(604);END;BEGIN HELPPTR:=3;
HELPLINE[2]:=605;HELPLINE[1]:=606;HELPLINE[0]:=607;END;ERROR;END;
IF(CURINPUT.INDEXFIELD<=6)THEN SCANFILENAME ELSE BEGIN CURNAME:=312;
CUREXT:=312;CURAREA:=312;END{:747};IF CUREXT=312 THEN CUREXT:=593;
PACKFILENAME(CURNAME,CURAREA,CUREXT);WHILE TRUE DO BEGIN BEGINFILEREA;
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;
PACKFILENAME(CURNAME,587,CUREXT);
IF AOPENIN(INPUTFILE[CURINPUT.INDEXFIELD])THEN GOTO 30;ENDFILEREADI;
PROMPTFILENA(589,593);END;
30:CURINPUT.NAMEFIELD:=AMAKENAMESTR(INPUTFILE[CURINPUT.INDEXFIELD]);
STRREF[CURNAME]:=127;IF JOBNAME=0 THEN BEGIN JOBNAME:=CURNAME;
OPENLOGFILE;END;
IF TERMOFFSET+(STRSTART[CURINPUT.NAMEFIELD+1]-STRSTART[CURINPUT.
NAMEFIELD])>MAXPRINTLINE-2 THEN PRINTLN ELSE IF(TERMOFFSET>0)OR(
FILEOFFSET>0)THEN PRINTCHAR(32);PRINTCHAR(40);PRINT(CURINPUT.NAMEFIELD);
BREAK(TTY);
IF CURINPUT.NAMEFIELD=STRPTR-1 THEN BEGIN FLUSHSTRING(CURINPUT.NAMEFIELD
);CURINPUT.NAMEFIELD:=CURNAME;END;{746:}
BEGIN IF INPUTLN(INPUTFILE[CURINPUT.INDEXFIELD],FALSE)THEN BEGIN IF(LAST
-CURINPUT.STARTFIELD=29)AND(BUFFER[CURINPUT.STARTFIELD]=67)AND(BUFFER[
CURINPUT.STARTFIELD+8]=22)THEN BEGIN WHILE(INPUTFILE[CURINPUT.INDEXFIELD
]↑<>CHR(12))AND(NOT EOF(INPUTFILE[CURINPUT.INDEXFIELD]))DO BEGIN READLN(
INPUTFILE[CURINPUT.INDEXFIELD]);
READ(INPUTFILE[CURINPUT.INDEXFIELD],AUXBUF:TEMPPTR);END;
BUFFER[CURINPUT.STARTFIELD]:=12;LAST:=CURINPUT.STARTFIELD+1;END;END;
PAGE:=1;FIRMUPTHELIN;BUFFER[CURINPUT.LIMITFIELD]:=37;
FIRST:=CURINPUT.LIMITFIELD+1;CURINPUT.LOCFIELD:=CURINPUT.STARTFIELD;
LINE:=1;END{:746};END;{:745}{776:}PROCEDURE BADEXP(S:STRNUMBER);
VAR SAVEFLAG:0..81;BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(S);END;PRINT(617);PRINTCMDMOD(CURCMD,CURMOD);
PRINTCHAR(39);BEGIN HELPPTR:=4;HELPLINE[3]:=618;HELPLINE[2]:=619;
HELPLINE[1]:=620;HELPLINE[0]:=621;END;BACKINPUT;CURSYM:=0;CURCMD:=40;
CURMOD:=0;INSERROR;SAVEFLAG:=VARFLAG;VARFLAG:=0;GETXNEXT;
VARFLAG:=SAVEFLAG;END;{:776}{779:}PROCEDURE STASHIN(P:HALFWORD);
VAR Q:HALFWORD;BEGIN MEM[P].HH.B0:=CURTYPE;
IF CURTYPE=15 THEN MEM[P+1].INT:=CUREXP ELSE BEGIN IF CURTYPE=19 THEN{
781:}BEGIN Q:=SINGLEDEPEND(CUREXP);
IF Q=DEPFINAL THEN BEGIN MEM[P].HH.B0:=15;MEM[P+1].INT:=0;FREENODE(Q,2);
END ELSE BEGIN MEM[P].HH.B0:=16;NEWDEP(P,Q);END;RECYCLEVALUE(CUREXP);
END{:781}ELSE BEGIN MEM[P+1]:=MEM[CUREXP+1];
MEM[MEM[P+1].HH.LH].HH.RH:=P;END;FREENODE(CUREXP,2);END;CURTYPE:=1;END;
{:779}{800:}PROCEDURE BACKEXPR;BEGIN BEGINTOKENLI(26002,9);
STACKARGUMEN(STASHCUREXP);END;{:800}{802:}PROCEDURE BADSUBSCRIPT;
BEGIN DISPERR(0,633);BEGIN HELPPTR:=3;HELPLINE[2]:=634;HELPLINE[1]:=635;
HELPLINE[0]:=636;END;FLUSHERROR(0);END;{:802}{804:}
PROCEDURE OBLITERATED(Q:HALFWORD);
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(637);
END;SHOWTOKENLIS(Q,0,1000);PRINT(638);BEGIN HELPPTR:=5;HELPLINE[4]:=639;
HELPLINE[3]:=640;HELPLINE[2]:=641;HELPLINE[1]:=642;HELPLINE[0]:=643;END;
END;{:804}{808:}{809:}PROCEDURE ENCAPSULATE(P:HALFWORD);
BEGIN CUREXP:=GETNODE(2);MEM[CUREXP].HH.B0:=CURTYPE;
MEM[CUREXP].HH.B1:=11;NEWDEP(CUREXP,P);END;{:809}{811:}
PROCEDURE INSTALL(R,Q:HALFWORD);VAR P:HALFWORD;
BEGIN IF MEM[Q].HH.B0=15 THEN BEGIN MEM[R+1].INT:=MEM[Q+1].INT;
MEM[R].HH.B0:=15;
END ELSE IF MEM[Q].HH.B0=19 THEN BEGIN P:=SINGLEDEPEND(Q);
IF P=DEPFINAL THEN BEGIN MEM[R].HH.B0:=15;MEM[R+1].INT:=0;FREENODE(P,2);
END ELSE BEGIN MEM[R].HH.B0:=16;NEWDEP(R,P);END;
END ELSE BEGIN MEM[R].HH.B0:=MEM[Q].HH.B0;
NEWDEP(R,COPYDEPLIST(MEM[Q+1].HH.RH));END;END;{:811}
PROCEDURE MAKEEXPCOPY(P:HALFWORD);LABEL 20;VAR Q,R,T:HALFWORD;
BEGIN 20:CURTYPE:=MEM[P].HH.B0;
CASE CURTYPE OF 1,2,15:CUREXP:=MEM[P+1].INT;
3,5,7,10,12:CUREXP:=NEWRINGENTRY(P);4:BEGIN CUREXP:=MEM[P+1].INT;
BEGIN IF STRREF[CUREXP]<127 THEN STRREF[CUREXP]:=STRREF[CUREXP]+1;END;
END;6:BEGIN CUREXP:=MEM[P+1].INT;MEM[CUREXP].HH.LH:=MEM[CUREXP].HH.LH+1;
END;9:CUREXP:=COPYEDGES(MEM[P+1].INT);
11,8:CUREXP:=COPYPATH(MEM[P+1].INT);13,14:{810:}
BEGIN IF MEM[P+1].INT=0 THEN INITBIGNODE(P);T:=GETNODE(2);
MEM[T].HH.B1:=11;MEM[T].HH.B0:=CURTYPE;INITBIGNODE(T);
Q:=MEM[P+1].INT+BIGNODESIZE[CURTYPE];
R:=MEM[T+1].INT+BIGNODESIZE[CURTYPE];REPEAT Q:=Q-2;R:=R-2;INSTALL(R,Q);
UNTIL Q=MEM[P+1].INT;CUREXP:=T;END{:810};
16,17:ENCAPSULATE(COPYDEPLIST(MEM[P+1].HH.RH));
18:BEGIN MEM[P].HH.B0:=19;MEM[P+1].INT:=0;GOTO 20;END;
19:BEGIN Q:=SINGLEDEPEND(P);IF Q=DEPFINAL THEN BEGIN CURTYPE:=15;
CUREXP:=0;FREENODE(Q,2);END ELSE BEGIN CURTYPE:=16;ENCAPSULATE(Q);END;
END;OTHERS:CONFUSION(647)END;END;{:808}{815:}
PROCEDURE BINARYMAC(P,C,N:HALFWORD);VAR Q,R:HALFWORD;BEGIN Q:=GETAVAIL;
R:=GETAVAIL;MEM[Q].HH.RH:=R;MEM[Q].HH.LH:=P;MEM[R].HH.LH:=STASHCUREXP;
MACROCALL(C,Q,N);END;{:815}{818:}PROCEDURE MATERIALIZEP;LABEL 50;
VAR AMINUSB,APLUSB,MAJORAXIS,MINORAXIS:SCALED;THETA:ANGLE;P:HALFWORD;
Q:HALFWORD;BEGIN Q:=CUREXP;
IF MEM[Q].HH.B0=0 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(653);END;BEGIN HELPPTR:=2;HELPLINE[1]:=654;
HELPLINE[0]:=422;END;PUTGETERROR;CUREXP:=3;GOTO 50;
END ELSE IF MEM[Q].HH.B0=4 THEN{819:}BEGIN TX:=MEM[Q+1].INT;
TY:=MEM[Q+2].INT;TXX:=MEM[Q+3].INT-TX;TYX:=MEM[Q+4].INT-TY;
TXY:=MEM[Q+5].INT-TX;TYY:=MEM[Q+6].INT-TY;
AMINUSB:=PYTHADD(TXX-TYY,TYX+TXY);APLUSB:=PYTHADD(TXX+TYY,TYX-TXY);
MAJORAXIS:=(AMINUSB+APLUSB)DIV 2;MINORAXIS:=(ABS(APLUSB-AMINUSB))DIV 2;
IF MAJORAXIS=MINORAXIS THEN THETA:=0 ELSE THETA:=(NARG(TXX-TYY,TYX+TXY)+
NARG(TXX+TYY,TYX-TXY))DIV 2;FREENODE(Q,7);
Q:=MAKEELLIPSE(MAJORAXIS,MINORAXIS,THETA);IF(TX<>0)OR(TY<>0)THEN{820:}
BEGIN P:=Q;REPEAT MEM[P+1].INT:=MEM[P+1].INT+TX;
MEM[P+2].INT:=MEM[P+2].INT+TY;P:=MEM[P].HH.RH;UNTIL P=Q;END{:820};
END{:819};CUREXP:=MAKEPEN(Q);50:TOSSKNOTLIST(Q);CURTYPE:=6;END;{:818}
{824:}{825:}PROCEDURE KNOWNPAIR;VAR P:HALFWORD;
BEGIN IF CURTYPE<>14 THEN BEGIN DISPERR(0,656);BEGIN HELPPTR:=3;
HELPLINE[2]:=657;HELPLINE[1]:=658;HELPLINE[0]:=659;END;PUTGETFLUSHE(0);
CURX:=0;CURY:=0;END ELSE BEGIN P:=MEM[CUREXP+1].INT;FREENODE(CUREXP,2);
{826:}
IF MEM[P].HH.B0=15 THEN CURX:=MEM[P+1].INT ELSE BEGIN DISPERR(P,660);
BEGIN HELPPTR:=3;HELPLINE[2]:=661;HELPLINE[1]:=658;HELPLINE[0]:=659;END;
PUTGETERROR;RECYCLEVALUE(P);CURX:=0;END;
IF MEM[P+2].HH.B0=15 THEN CURY:=MEM[P+3].INT ELSE BEGIN DISPERR(P+2,662)
;BEGIN HELPPTR:=3;HELPLINE[2]:=663;HELPLINE[1]:=658;HELPLINE[0]:=659;
END;PUTGETERROR;RECYCLEVALUE(P+2);CURY:=0;END{:826};FREENODE(P,4);
CURTYPE:=15;END;END;{:825}FUNCTION NEWKNOT:HALFWORD;VAR Q:HALFWORD;
BEGIN Q:=GETNODE(7);MEM[Q].HH.B0:=0;MEM[Q].HH.B1:=0;MEM[Q].HH.RH:=Q;
KNOWNPAIR;MEM[Q+1].INT:=CURX;MEM[Q+2].INT:=CURY;NEWKNOT:=Q;END;{:824}
{828:}FUNCTION SCANDIRECTIO:SMALLNUMBER;VAR T:2..4;X:SCALED;
BEGIN GETXNEXT;IF CURCMD=60 THEN{829:}BEGIN GETXNEXT;SCANEXPRESSI;
IF(CURTYPE<>15)OR(CUREXP<0)THEN BEGIN DISPERR(0,666);BEGIN HELPPTR:=1;
HELPLINE[0]:=667;END;PUTGETFLUSHE(65536);END;T:=3;END{:829}ELSE{830:}
BEGIN SCANEXPRESSI;IF CURTYPE>14 THEN{831:}
BEGIN IF CURTYPE<>15 THEN BEGIN DISPERR(0,660);BEGIN HELPPTR:=3;
HELPLINE[2]:=661;HELPLINE[1]:=658;HELPLINE[0]:=659;END;PUTGETFLUSHE(0);
END;X:=CUREXP;IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=2;
HELPLINE[1]:=668;HELPLINE[0]:=669;END;BACKERROR;END;GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN BEGIN DISPERR(0,662);BEGIN HELPPTR:=3;
HELPLINE[2]:=663;HELPLINE[1]:=658;HELPLINE[0]:=659;END;PUTGETFLUSHE(0);
END;CURY:=CUREXP;CURX:=X;END{:831}ELSE KNOWNPAIR;
IF(CURX=0)AND(CURY=0)THEN T:=4 ELSE BEGIN T:=2;CUREXP:=GETNODE(3);
MEM[CUREXP+1].INT:=CURX;MEM[CUREXP+2].INT:=CURY;END;END{:830};
IF CURCMD<>64 THEN BEGIN MISSINGERR(125);BEGIN HELPPTR:=3;
HELPLINE[2]:=664;HELPLINE[1]:=665;HELPLINE[0]:=541;END;BACKERROR;END;
GETXNEXT;SCANDIRECTIO:=T;END;{:828}{850:}
PROCEDURE DONULLARY(C:QUARTERWORD);VAR K:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN SHOWCMDMOD(32,C);
CASE C OF 30,31:BEGIN CURTYPE:=2;CUREXP:=C;END;32:BEGIN CURTYPE:=9;
CUREXP:=GETNODE(6);INITEDGES(CUREXP);END;33:BEGIN CURTYPE:=6;CUREXP:=3;
END;37:BEGIN CURTYPE:=15;CUREXP:=NORMRAND;END;36:{851:}BEGIN CURTYPE:=8;
CUREXP:=GETNODE(7);MEM[CUREXP].HH.B0:=4;MEM[CUREXP].HH.B1:=4;
MEM[CUREXP].HH.RH:=CUREXP;MEM[CUREXP+1].INT:=0;MEM[CUREXP+2].INT:=0;
MEM[CUREXP+3].INT:=65536;MEM[CUREXP+4].INT:=0;MEM[CUREXP+5].INT:=0;
MEM[CUREXP+6].INT:=65536;END{:851};
34:BEGIN IF JOBNAME=0 THEN OPENLOGFILE;CURTYPE:=4;CUREXP:=JOBNAME;END;
35:{852:}BEGIN IF INTERACTION<=1 THEN FATALERROR(530);BEGINFILEREA;
CURINPUT.NAMEFIELD:=1;BEGIN BEGIN IF INSKP0 THEN END;PRINT(312);
TERMINPUT;END;
BEGIN IF POOLPTR+LAST-CURINPUT.STARTFIELD>MAXPOOLPTR THEN BEGIN IF
POOLPTR+LAST-CURINPUT.STARTFIELD>POOLSIZE THEN OVERFLOW(129,POOLSIZE-
INITPOOLPTR);MAXPOOLPTR:=POOLPTR+LAST-CURINPUT.STARTFIELD;END;END;
FOR K:=CURINPUT.STARTFIELD TO LAST-1 DO BEGIN STRPOOL[POOLPTR]:=BUFFER[K
];POOLPTR:=POOLPTR+1;END;ENDFILEREADI;CURTYPE:=4;CUREXP:=MAKESTRING;
END{:852};END;BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:850}{853:}
{854:}FUNCTION NICEPAIR(P:HALFWORD;T:QUARTERWORD):BOOLEAN;LABEL 10;
BEGIN IF T=14 THEN BEGIN P:=MEM[P+1].INT;
IF MEM[P].HH.B0=15 THEN IF MEM[P+2].HH.B0=15 THEN BEGIN NICEPAIR:=TRUE;
GOTO 10;END;END;NICEPAIR:=FALSE;10:END;{:854}{855:}
PROCEDURE PRINTKNOWNOR(T:SMALLNUMBER;V:INTEGER);BEGIN PRINTCHAR(40);
IF T<16 THEN IF T<>14 THEN PRINTTYPE(T)ELSE IF NICEPAIR(V,14)THEN PRINT(
210)ELSE PRINT(682)ELSE PRINT(683);PRINTCHAR(41);END;{:855}{856:}
PROCEDURE BADUNARY(C:QUARTERWORD);BEGIN DISPERR(0,684);PRINTOP(C);
PRINTKNOWNOR(CURTYPE,CUREXP);BEGIN HELPPTR:=3;HELPLINE[2]:=685;
HELPLINE[1]:=686;HELPLINE[0]:=687;END;PUTGETERROR;END;{:856}{859:}
PROCEDURE NEGATEDEPLIS(P:HALFWORD);LABEL 10;
BEGIN WHILE TRUE DO BEGIN MEM[P+1].INT:=-MEM[P+1].INT;
IF MEM[P].HH.LH=0 THEN GOTO 10;P:=MEM[P].HH.RH;END;10:END;{:859}{863:}
PROCEDURE PAIRTOPATH;BEGIN CUREXP:=NEWKNOT;CURTYPE:=11;END;{:863}{865:}
PROCEDURE TAKEPART(C:QUARTERWORD);VAR P:HALFWORD;
BEGIN P:=MEM[CUREXP+1].INT;MEM[20].INT:=P;MEM[19].HH.B0:=CURTYPE;
MEM[P].HH.RH:=19;FREENODE(CUREXP,2);MAKEEXPCOPY(P+2*(C-51));
RECYCLEVALUE(19);END;{:865}{868:}PROCEDURE STRTONUM(C:QUARTERWORD);
VAR N:INTEGER;M:ASCIICODE;K:POOLPOINTER;B:8..16;BADCHAR:BOOLEAN;
BEGIN IF C=48 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN N:=-1
ELSE N:=STRPOOL[STRSTART[CUREXP]]ELSE BEGIN IF C=46 THEN B:=8 ELSE B:=16
;N:=0;BADCHAR:=FALSE;
FOR K:=STRSTART[CUREXP]TO STRSTART[CUREXP+1]-1 DO BEGIN M:=STRPOOL[K];
IF(M>=48)AND(M<=57)THEN M:=M-48 ELSE IF(M>=65)AND(M<=70)THEN M:=M-55
ELSE IF(M>=97)AND(M<=102)THEN M:=M-87 ELSE BEGIN BADCHAR:=TRUE;M:=0;END;
IF M>=B THEN BEGIN BADCHAR:=TRUE;M:=0;END;
IF N<32768 DIV B THEN N:=N*B+M ELSE N:=32767;END;{869:}
IF BADCHAR THEN BEGIN DISPERR(0,689);IF C=46 THEN BEGIN HELPPTR:=1;
HELPLINE[0]:=690;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=691;END;
PUTGETERROR;END;
IF N>4095 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(692);END;PRINTINT(N);PRINTCHAR(41);BEGIN HELPPTR:=1;
HELPLINE[0]:=693;END;PUTGETERROR;END{:869};END;FLUSHCUREXP(N*65536);END;
{:868}{870:}FUNCTION PATHLENGTH:SCALED;VAR N:SCALED;P:HALFWORD;
BEGIN P:=CUREXP;IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;
REPEAT P:=MEM[P].HH.RH;N:=N+65536;UNTIL P=CUREXP;PATHLENGTH:=N;END;
{:870}{872:}PROCEDURE TESTKNOWN;LABEL 30;VAR B:30..31;P,Q:HALFWORD;
BEGIN B:=31;CASE CURTYPE OF 2,4,6,8,9,11,15:B:=30;
13,14:BEGIN P:=MEM[CUREXP+1].INT;Q:=P+BIGNODESIZE[CURTYPE];
REPEAT Q:=Q-2;IF MEM[Q].HH.B0<>15 THEN GOTO 30;UNTIL Q=P;B:=30;30:END;
OTHERS:END;FLUSHCUREXP(B);CURTYPE:=2;END;{:872}
PROCEDURE DOUNARY(C:QUARTERWORD);VAR P,Q:HALFWORD;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN{857:}BEGIN BEGINDIAGNOS;PRINTNL(123);
PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);PRINT(688);ENDDIAGNOSTI(FALSE);
END{:857};CASE C OF 67:IF CURTYPE<14 THEN BADUNARY(67);68:{858:}
CASE CURTYPE OF 14,19:BEGIN Q:=CUREXP;MAKEEXPCOPY(Q);
IF CURTYPE=16 THEN NEGATEDEPLIS(MEM[CUREXP+1].HH.RH)ELSE IF CURTYPE=14
THEN BEGIN P:=MEM[CUREXP+1].INT;
IF MEM[P].HH.B0=15 THEN MEM[P+1].INT:=-MEM[P+1].INT ELSE NEGATEDEPLIS(
MEM[P+1].HH.RH);
IF MEM[P+2].HH.B0=15 THEN MEM[P+3].INT:=-MEM[P+3].INT ELSE NEGATEDEPLIS(
MEM[P+3].HH.RH);END;RECYCLEVALUE(Q);FREENODE(Q,2);END;
16,17:NEGATEDEPLIS(MEM[CUREXP+1].HH.RH);15:CUREXP:=-CUREXP;
9:NEGATEEDGES(CUREXP);OTHERS:BADUNARY(68)END{:858};{860:}
40:IF CURTYPE<>2 THEN BADUNARY(40)ELSE CUREXP:=61-CUREXP;{:860}{861:}
57,58,59,60,61,62,63,38,64:IF CURTYPE<>15 THEN BADUNARY(C)ELSE CASE C OF
57:CUREXP:=SQUARERT(CUREXP);58:CUREXP:=MEXP(CUREXP);
59:CUREXP:=MLOG(CUREXP);60,61:BEGIN NSINCOS((CUREXP MOD 23592960)*16);
IF C=60 THEN CUREXP:=ROUNDFRACTIO(NSIN)ELSE CUREXP:=ROUNDFRACTIO(NCOS);
END;62:CUREXP:=FLOORSCALED(CUREXP);63:CUREXP:=UNIFRAND(CUREXP);
38:BEGIN IF ODD(ROUNDUNSCALE(CUREXP))THEN CUREXP:=30 ELSE CUREXP:=31;
CURTYPE:=2;END;64:{1124:}BEGIN CUREXP:=ROUNDUNSCALE(CUREXP)MOD 256;
IF CUREXP<0 THEN CUREXP:=CUREXP+256;
IF CHAREXISTS[CUREXP]THEN CUREXP:=30 ELSE CUREXP:=31;CURTYPE:=2;
END{:1124};END;{:861}{862:}
65:IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
FLUSHCUREXP((NARG(MEM[P+1].INT,MEM[P+3].INT)+8)DIV 16)END ELSE BADUNARY(
65);{:862}{864:}
51,52:IF(CURTYPE<=14)AND(CURTYPE>=13)THEN TAKEPART(C)ELSE BADUNARY(C);
53,54,55,56:IF CURTYPE=13 THEN TAKEPART(C)ELSE BADUNARY(C);{:864}{867:}
49:IF CURTYPE<>15 THEN BADUNARY(49)ELSE BEGIN CUREXP:=ROUNDUNSCALE(
CUREXP)MOD 128;CURTYPE:=4;IF CUREXP<0 THEN CUREXP:=CUREXP+128;END;
41:IF CURTYPE<>15 THEN BADUNARY(41)ELSE BEGIN OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINTSCALED(CUREXP);CUREXP:=MAKESTRING;SELECTOR:=OLDSETTING;
CURTYPE:=4;END;46,47,48:IF CURTYPE<>4 THEN BADUNARY(C)ELSE STRTONUM(C);
50:IF CURTYPE=4 THEN BEGIN BEGIN IF STRREF[CUREXP]<127 THEN IF STRREF[
CUREXP]>1 THEN STRREF[CUREXP]:=STRREF[CUREXP]-1 ELSE FLUSHSTRING(CUREXP)
;END;CURTYPE:=15;CUREXP:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])*65536;
END ELSE IF CURTYPE=11 THEN FLUSHCUREXP(PATHLENGTH)ELSE IF CURTYPE=14
THEN FLUSHCUREXP(0)ELSE BADUNARY(C);{:867}{871:}
2:BEGIN IF(CURTYPE>=2)AND(CURTYPE<=3)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
4:BEGIN IF(CURTYPE>=4)AND(CURTYPE<=5)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
6:BEGIN IF(CURTYPE>=6)AND(CURTYPE<=8)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
9:BEGIN IF(CURTYPE>=9)AND(CURTYPE<=10)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
11:BEGIN IF(CURTYPE>=11)AND(CURTYPE<=12)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;
13,14:BEGIN IF CURTYPE=C THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);
CURTYPE:=2;END;
18:BEGIN IF(CURTYPE>=15)AND(CURTYPE<=17)THEN FLUSHCUREXP(30)ELSE
FLUSHCUREXP(31);CURTYPE:=2;END;39:TESTKNOWN;{:871}{873:}
66:BEGIN IF CURTYPE<>11 THEN FLUSHCUREXP(31)ELSE IF MEM[CUREXP].HH.B0<>0
THEN FLUSHCUREXP(30)ELSE FLUSHCUREXP(31);CURTYPE:=2;END;{:873}{874:}
44:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF CURTYPE=11 THEN CURTYPE:=8 ELSE BADUNARY(44);END;
43:IF CURTYPE<>6 THEN BADUNARY(43)ELSE BEGIN FLUSHCUREXP(MAKEPATH(CUREXP
));CURTYPE:=11;END;
45:IF CURTYPE<>9 THEN BADUNARY(45)ELSE FLUSHCUREXP(TOTALWEIGHT(CUREXP));
42:IF CURTYPE=11 THEN BEGIN P:=MEM[HTAPYPOC(CUREXP)].HH.RH;
TOSSKNOTLIST(CUREXP);CUREXP:=P;
END ELSE IF CURTYPE=14 THEN PAIRTOPATH ELSE BADUNARY(42);{:874}END;
BEGIN IF ARITHERROR THEN CLEARARITH;END;END;{:853}{875:}{876:}
PROCEDURE BADBINARY(P:HALFWORD;C:QUARTERWORD);BEGIN DISPERR(P,312);
DISPERR(0,684);IF C>=91 THEN PRINTOP(C);PRINTKNOWNOR(MEM[P].HH.B0,P);
IF C>=91 THEN PRINT(339)ELSE PRINTOP(C);PRINTKNOWNOR(CURTYPE,CUREXP);
BEGIN HELPPTR:=3;HELPLINE[2]:=685;HELPLINE[1]:=694;HELPLINE[0]:=695;END;
PUTGETERROR;END;{:876}{881:}FUNCTION TARNISHED(P:HALFWORD):HALFWORD;
LABEL 10;VAR Q:HALFWORD;R:HALFWORD;BEGIN Q:=MEM[P+1].INT;
R:=Q+BIGNODESIZE[MEM[P].HH.B0];REPEAT R:=R-2;
IF MEM[R].HH.B0=19 THEN BEGIN TARNISHED:=1;GOTO 10;END;UNTIL R=Q;
TARNISHED:=0;10:END;{:881}{883:}{888:}PROCEDURE DEPFINISH(V,Q:HALFWORD;
T:SMALLNUMBER);VAR P:HALFWORD;VV:SCALED;
BEGIN IF Q=0 THEN P:=CUREXP ELSE P:=Q;MEM[P+1].HH.RH:=V;MEM[P].HH.B0:=T;
IF MEM[V].HH.LH=0 THEN BEGIN VV:=MEM[V+1].INT;
IF Q=0 THEN FLUSHCUREXP(VV)ELSE BEGIN RECYCLEVALUE(P);MEM[Q].HH.B0:=15;
MEM[Q+1].INT:=VV;END;END ELSE IF Q=0 THEN CURTYPE:=T;
IF FIXNEEDED THEN FIXDEPENDENC;END;{:888}
PROCEDURE ADDORSUBTRAC(P,Q:HALFWORD;C:QUARTERWORD);LABEL 30,10;
VAR S,T:SMALLNUMBER;R:HALFWORD;V:INTEGER;
BEGIN IF Q=0 THEN BEGIN T:=CURTYPE;
IF T<16 THEN V:=CUREXP ELSE V:=MEM[CUREXP+1].HH.RH;
END ELSE BEGIN T:=MEM[Q].HH.B0;
IF T<16 THEN V:=MEM[Q+1].INT ELSE V:=MEM[Q+1].HH.RH;END;
IF T=15 THEN BEGIN IF C=68 THEN V:=-V;
IF MEM[P].HH.B0=15 THEN BEGIN V:=MEM[P+1].INT+V;
IF Q=0 THEN CUREXP:=V ELSE MEM[Q+1].INT:=V;GOTO 10;END;{884:}
R:=MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
MEM[R+1].INT:=MEM[R+1].INT+V;IF Q=0 THEN BEGIN Q:=GETNODE(2);CUREXP:=Q;
CURTYPE:=MEM[P].HH.B0;MEM[Q].HH.B1:=11;END;
MEM[Q+1].HH.RH:=MEM[P+1].HH.RH;MEM[Q].HH.B0:=MEM[P].HH.B0;
MEM[Q+1].HH.LH:=MEM[P+1].HH.LH;MEM[MEM[P+1].HH.LH].HH.RH:=Q;
MEM[P].HH.B0:=15;{:884};END ELSE BEGIN IF C=68 THEN NEGATEDEPLIS(V);
{885:}IF MEM[P].HH.B0=15 THEN{886:}
BEGIN WHILE MEM[V].HH.LH<>0 DO V:=MEM[V].HH.RH;
MEM[V+1].INT:=MEM[P+1].INT+MEM[V+1].INT;END{:886}
ELSE BEGIN S:=MEM[P].HH.B0;R:=MEM[P+1].HH.RH;
IF T=16 THEN BEGIN IF S=16 THEN IF MAXCOEF(R)+MAXCOEF(V)<626349397 THEN
BEGIN V:=PPLUSQ(V,R,16);GOTO 30;END;T:=17;V:=POVERV(V,65536,16,17);END;
IF S=17 THEN V:=PPLUSQ(V,R,17)ELSE V:=PPLUSFQ(V,65536,R,17,16);30:{887:}
IF Q<>0 THEN DEPFINISH(V,Q,T)ELSE BEGIN CURTYPE:=T;DEPFINISH(V,0,T);
END{:887};END{:885};END;10:END;{:883}{896:}PROCEDURE DEPMULT(P:HALFWORD;
V:INTEGER;VISSCALED:BOOLEAN);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>15 THEN Q:=P ELSE
BEGIN IF VISSCALED THEN MEM[P+1].INT:=TAKESCALED(MEM[P+1].INT,V)ELSE MEM
[P+1].INT:=TAKEFRACTION(MEM[P+1].INT,V);GOTO 10;END;T:=MEM[Q].HH.B0;
Q:=MEM[Q+1].HH.RH;S:=T;
IF T=16 THEN IF VISSCALED THEN IF ABVSCD(MAXCOEF(Q),ABS(V),626349396,
65536)>=0 THEN T:=17;Q:=PTIMESV(Q,V,S,T,VISSCALED);DEPFINISH(Q,P,T);
10:END;{:896}{899:}PROCEDURE HARDTIMES(P:HALFWORD);VAR Q:HALFWORD;
R:HALFWORD;U,V:SCALED;
BEGIN IF MEM[P].HH.B0=14 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);P:=Q;
END;R:=MEM[CUREXP+1].INT;U:=MEM[R+1].INT;V:=MEM[R+3].INT;{900:}
MEM[R+2].HH.B0:=MEM[P].HH.B0;NEWDEP(R+2,COPYDEPLIST(MEM[P+1].HH.RH));
MEM[R].HH.B0:=MEM[P].HH.B0;MEM[R+1]:=MEM[P+1];
MEM[MEM[P+1].HH.LH].HH.RH:=R;FREENODE(P,2){:900};DEPMULT(R,U,TRUE);
DEPMULT(R+2,V,TRUE);END;{:899}{902:}PROCEDURE DEPDIV(P:HALFWORD;
V:SCALED);LABEL 10;VAR Q:HALFWORD;S,T:SMALLNUMBER;
BEGIN IF P=0 THEN Q:=CUREXP ELSE IF MEM[P].HH.B0<>15 THEN Q:=P ELSE
BEGIN MEM[P+1].INT:=MAKESCALED(MEM[P+1].INT,V);GOTO 10;END;
T:=MEM[Q].HH.B0;Q:=MEM[Q+1].HH.RH;S:=T;
IF T=16 THEN IF ABVSCD(MAXCOEF(Q),65536,626349396,ABS(V))>=0 THEN T:=17;
Q:=POVERV(Q,V,S,T);DEPFINISH(Q,P,T);10:END;{:902}{906:}
PROCEDURE SETUPTRANS(C:QUARTERWORD);LABEL 30,10;VAR P,Q,R:HALFWORD;
BEGIN IF(C<>85)OR(CURTYPE<>13)THEN{908:}BEGIN P:=STASHCUREXP;
CUREXP:=IDTRANSFORM;CURTYPE:=13;Q:=MEM[CUREXP+1].INT;CASE C OF{910:}
81:IF MEM[P].HH.B0=15 THEN{911:}
BEGIN NSINCOS((MEM[P+1].INT MOD 23592960)*16);
MEM[Q+5].INT:=ROUNDFRACTIO(NCOS);MEM[Q+9].INT:=ROUNDFRACTIO(NSIN);
MEM[Q+7].INT:=-MEM[Q+9].INT;MEM[Q+11].INT:=MEM[Q+5].INT;GOTO 30;
END{:911};82:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+6,P);GOTO 30;END;
83:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+4,P);INSTALL(Q+10,P);GOTO 30;
END;84:IF MEM[P].HH.B0=14 THEN BEGIN R:=MEM[P+1].INT;INSTALL(Q,R);
INSTALL(Q+2,R+2);GOTO 30;END;
86:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+4,P);GOTO 30;END;
87:IF MEM[P].HH.B0>14 THEN BEGIN INSTALL(Q+10,P);GOTO 30;END;
88:IF MEM[P].HH.B0=14 THEN{912:}BEGIN R:=MEM[P+1].INT;INSTALL(Q+4,R);
INSTALL(Q+10,R);INSTALL(Q+8,R+2);
IF MEM[R+2].HH.B0=15 THEN MEM[R+3].INT:=-MEM[R+3].INT ELSE NEGATEDEPLIS(
MEM[R+3].HH.RH);INSTALL(Q+6,R+2);GOTO 30;END{:912};85:;{:910}END;
DISPERR(P,704);BEGIN HELPPTR:=2;HELPLINE[1]:=705;HELPLINE[0]:=706;END;
PUTGETERROR;30:RECYCLEVALUE(P);FREENODE(P,2);END{:908};{909:}
Q:=MEM[CUREXP+1].INT;R:=Q+12;REPEAT R:=R-2;
IF MEM[R].HH.B0<>15 THEN GOTO 10;UNTIL R=Q;TXX:=MEM[Q+5].INT;
TXY:=MEM[Q+7].INT;TYX:=MEM[Q+9].INT;TYY:=MEM[Q+11].INT;TX:=MEM[Q+1].INT;
TY:=MEM[Q+3].INT;FLUSHCUREXP(0){:909};10:END;{:906}{913:}
PROCEDURE SETUPKNOWNTR(C:QUARTERWORD);BEGIN SETUPTRANS(C);
IF CURTYPE<>15 THEN BEGIN DISPERR(0,707);BEGIN HELPPTR:=2;
HELPLINE[1]:=708;HELPLINE[0]:=709;END;PUTGETFLUSHE(0);TXX:=65536;TXY:=0;
TYX:=0;TYY:=65536;TX:=0;TY:=0;END;END;{:913}{914:}
PROCEDURE TRANS(P,Q:HALFWORD);VAR V:SCALED;
BEGIN V:=TAKESCALED(MEM[P].INT,TXX)+TAKESCALED(MEM[Q].INT,TXY)+TX;
MEM[Q].INT:=TAKESCALED(MEM[P].INT,TYX)+TAKESCALED(MEM[Q].INT,TYY)+TY;
MEM[P].INT:=V;END;{:914}{915:}PROCEDURE PATHTRANS(P:HALFWORD;
C:QUARTERWORD);VAR Q:HALFWORD;BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);
Q:=CUREXP;REPEAT IF MEM[Q].HH.B0<>0 THEN TRANS(Q+3,Q+4);TRANS(Q+1,Q+2);
IF MEM[Q].HH.B1<>0 THEN TRANS(Q+5,Q+6);Q:=MEM[Q].HH.RH;UNTIL Q=CUREXP;
END;{:915}{916:}PROCEDURE EDGESTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
BEGIN SETUPKNOWNTR(C);UNSTASHCUREX(P);CUREDGES:=CUREXP;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;
IF ABS(TXY)=65536 THEN IF ABS(TYX)=65536 THEN IF TXX=0 THEN IF TYY=0
THEN BEGIN XYSWAPEDGES;TXX:=TXY;TYY:=TYX;TXY:=0;TYX:=0;
IF MEM[CUREDGES].HH.RH=CUREDGES THEN GOTO 10;END;
IF ABS(TXX)=65536 THEN IF ABS(TYY)=65536 THEN IF TXY=0 THEN IF TYX=0
THEN BEGIN IF TXX<0 THEN XREFLECTEDGE;IF TYY<0 THEN YREFLECTEDGE;{917:}
TX:=ROUNDUNSCALE(TX);TY:=ROUNDUNSCALE(TY);
IF(MEM[CUREDGES+2].HH.LH+TX<=0)OR(MEM[CUREDGES+2].HH.RH+TX>=8192)OR(MEM[
CUREDGES+1].HH.LH+TY<=0)OR(MEM[CUREDGES+1].HH.RH+TY>=8191)OR(ABS(TX)>=
4096)OR(ABS(TY)>=4096)THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(713);END;BEGIN HELPPTR:=2;
HELPLINE[1]:=714;HELPLINE[0]:=715;END;PUTGETERROR;
END ELSE BEGIN IF TX<>0 THEN BEGIN IF NOT(ABS(MEM[CUREDGES+3].HH.LH-TX
-4096)<4096)THEN FIXOFFSET;
MEM[CUREDGES+2].HH.LH:=MEM[CUREDGES+2].HH.LH+TX;
MEM[CUREDGES+2].HH.RH:=MEM[CUREDGES+2].HH.RH+TX;
MEM[CUREDGES+3].HH.LH:=MEM[CUREDGES+3].HH.LH-TX;MEM[CUREDGES+4].INT:=0;
END;IF TY<>0 THEN BEGIN MEM[CUREDGES+1].HH.LH:=MEM[CUREDGES+1].HH.LH+TY;
MEM[CUREDGES+1].HH.RH:=MEM[CUREDGES+1].HH.RH+TY;
MEM[CUREDGES+5].HH.LH:=MEM[CUREDGES+5].HH.LH+TY;MEM[CUREDGES+4].INT:=0;
END;END{:917};GOTO 10;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(710);END;BEGIN HELPPTR:=2;HELPLINE[1]:=711;
HELPLINE[0]:=712;END;PUTGETERROR;10:END;{:916}{918:}{920:}
PROCEDURE BILIN1(P:HALFWORD;T:SCALED;Q:HALFWORD;U,DELTA:SCALED);
VAR R:HALFWORD;BEGIN IF T<>65536 THEN DEPMULT(P,T,TRUE);
IF U<>0 THEN IF MEM[Q].HH.B0=15 THEN DELTA:=DELTA+TAKESCALED(MEM[Q+1].
INT,U)ELSE BEGIN{921:}
IF MEM[P].HH.B0<>17 THEN BEGIN IF MEM[P].HH.B0=15 THEN NEWDEP(P,
CONSTDEPENDE(MEM[P+1].INT))ELSE MEM[P+1].HH.RH:=PTIMESV(MEM[P+1].HH.RH,
65536,16,17,TRUE);MEM[P].HH.B0:=17;END{:921};
MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH.RH,U,MEM[Q+1].HH.RH,17,MEM[Q].HH.B0)
;END;
IF MEM[P].HH.B0=15 THEN MEM[P+1].INT:=MEM[P+1].INT+DELTA ELSE BEGIN R:=
MEM[P+1].HH.RH;WHILE MEM[R].HH.LH<>0 DO R:=MEM[R].HH.RH;
DELTA:=MEM[R+1].INT+DELTA;
IF R<>MEM[P+1].HH.RH THEN MEM[R+1].INT:=DELTA ELSE BEGIN RECYCLEVALUE(P)
;MEM[P].HH.B0:=15;MEM[P+1].INT:=DELTA;END;END;
IF FIXNEEDED THEN FIXDEPENDENC;END;{:920}{923:}
PROCEDURE ADDMULTDEP(P:HALFWORD;V:SCALED;R:HALFWORD);
BEGIN IF MEM[R].HH.B0=15 THEN MEM[DEPFINAL+1].INT:=MEM[DEPFINAL+1].INT+
TAKESCALED(MEM[R+1].INT,V)ELSE BEGIN MEM[P+1].HH.RH:=PPLUSFQ(MEM[P+1].HH
.RH,V,MEM[R+1].HH.RH,17,MEM[R].HH.B0);IF FIXNEEDED THEN FIXDEPENDENC;
END;END;{:923}{924:}PROCEDURE BILIN2(P,T:HALFWORD;V:SCALED;
U,Q:HALFWORD);VAR VV:SCALED;BEGIN VV:=MEM[P+1].INT;MEM[P].HH.B0:=17;
NEWDEP(P,CONSTDEPENDE(0));IF VV<>0 THEN ADDMULTDEP(P,VV,T);
IF V<>0 THEN ADDMULTDEP(P,V,U);IF Q<>0 THEN ADDMULTDEP(P,65536,Q);
IF MEM[P+1].HH.RH=DEPFINAL THEN BEGIN VV:=MEM[DEPFINAL+1].INT;
RECYCLEVALUE(P);MEM[P].HH.B0:=15;MEM[P+1].INT:=VV;END;END;{:924}{926:}
PROCEDURE BILIN3(P:HALFWORD;T,V,U,DELTA:SCALED);
BEGIN IF T<>65536 THEN DELTA:=DELTA+TAKESCALED(MEM[P+1].INT,T)ELSE DELTA
:=DELTA+MEM[P+1].INT;
IF U<>0 THEN MEM[P+1].INT:=DELTA+TAKESCALED(V,U)ELSE MEM[P+1].INT:=DELTA
;END;{:926}PROCEDURE BIGTRANS(P:HALFWORD;C:QUARTERWORD);LABEL 10;
VAR Q,R,PP,QQ:HALFWORD;S:SMALLNUMBER;BEGIN S:=BIGNODESIZE[MEM[P].HH.B0];
Q:=MEM[P+1].INT;R:=Q+S;REPEAT R:=R-2;IF MEM[R].HH.B0<>15 THEN{919:}
BEGIN SETUPKNOWNTR(C);MAKEEXPCOPY(P);R:=MEM[CUREXP+1].INT;
IF CURTYPE=13 THEN BEGIN BILIN1(R+10,TYY,Q+6,TYX,0);
BILIN1(R+8,TYY,Q+4,TYX,0);BILIN1(R+6,TXX,Q+10,TXY,0);
BILIN1(R+4,TXX,Q+8,TXY,0);END;BILIN1(R+2,TYY,Q,TYX,TY);
BILIN1(R,TXX,Q+2,TXY,TX);GOTO 10;END{:919};UNTIL R=Q;{922:}
SETUPTRANS(C);IF CURTYPE=15 THEN{925:}BEGIN MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=13 THEN BEGIN BILIN3(R+10,TYY,MEM[Q+7].INT,TYX,0);
BILIN3(R+8,TYY,MEM[Q+5].INT,TYX,0);BILIN3(R+6,TXX,MEM[Q+11].INT,TXY,0);
BILIN3(R+4,TXX,MEM[Q+9].INT,TXY,0);END;
BILIN3(R+2,TYY,MEM[Q+1].INT,TYX,TY);BILIN3(R,TXX,MEM[Q+3].INT,TXY,TX);
END{:925}ELSE BEGIN PP:=STASHCUREXP;QQ:=MEM[PP+1].INT;MAKEEXPCOPY(P);
R:=MEM[CUREXP+1].INT;
IF CURTYPE=13 THEN BEGIN BILIN2(R+10,QQ+10,MEM[Q+7].INT,QQ+8,0);
BILIN2(R+8,QQ+10,MEM[Q+5].INT,QQ+8,0);
BILIN2(R+6,QQ+4,MEM[Q+11].INT,QQ+6,0);
BILIN2(R+4,QQ+4,MEM[Q+9].INT,QQ+6,0);END;
BILIN2(R+2,QQ+10,MEM[Q+1].INT,QQ+8,QQ+2);
BILIN2(R,QQ+4,MEM[Q+3].INT,QQ+6,QQ);RECYCLEVALUE(PP);FREENODE(PP,2);END;
{:922};10:END;{:918}{928:}PROCEDURE CAT(P:HALFWORD);VAR A,B:STRNUMBER;
K:POOLPOINTER;BEGIN A:=MEM[P+1].INT;B:=CUREXP;
BEGIN IF POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[B+1]-STRSTART[B])
>MAXPOOLPTR THEN BEGIN IF POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[
B+1]-STRSTART[B])>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
MAXPOOLPTR:=POOLPTR+(STRSTART[A+1]-STRSTART[A])+(STRSTART[B+1]-STRSTART[
B]);END;END;
FOR K:=STRSTART[A]TO STRSTART[A+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;
FOR K:=STRSTART[B]TO STRSTART[B+1]-1 DO BEGIN STRPOOL[POOLPTR]:=STRPOOL[
K];POOLPTR:=POOLPTR+1;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[B]<127 THEN IF STRREF[B]>1 THEN STRREF[B]:=STRREF[B]-1
ELSE FLUSHSTRING(B);END;END;{:928}{929:}
PROCEDURE CHOPSTRING(P:HALFWORD);VAR A,B:INTEGER;L:INTEGER;K:INTEGER;
S:STRNUMBER;BEGIN A:=ROUNDUNSCALE(MEM[P+1].INT);
B:=ROUNDUNSCALE(MEM[P+3].INT);S:=CUREXP;L:=(STRSTART[S+1]-STRSTART[S]);
IF A<0 THEN A:=0;IF B>L THEN B:=L;
IF A<B THEN BEGIN BEGIN IF POOLPTR+B-A>MAXPOOLPTR THEN BEGIN IF POOLPTR+
B-A>POOLSIZE THEN OVERFLOW(129,POOLSIZE-INITPOOLPTR);
MAXPOOLPTR:=POOLPTR+B-A;END;END;
FOR K:=STRSTART[S]+A TO STRSTART[S]+B-1 DO BEGIN STRPOOL[POOLPTR]:=
STRPOOL[K];POOLPTR:=POOLPTR+1;END;END;CUREXP:=MAKESTRING;
BEGIN IF STRREF[S]<127 THEN IF STRREF[S]>1 THEN STRREF[S]:=STRREF[S]-1
ELSE FLUSHSTRING(S);END;END;{:929}{930:}PROCEDURE CHOPPATH(P:HALFWORD);
VAR Q:HALFWORD;PP,QQ,RR,SS:HALFWORD;A,B,L:SCALED;BEGIN L:=PATHLENGTH;
A:=MEM[P+1].INT;B:=MEM[P+3].INT;{931:}
IF A<0 THEN IF MEM[CUREXP].HH.B0=0 THEN A:=0 ELSE REPEAT A:=A+L;B:=B+L;
UNTIL A>=0;IF B>L THEN IF MEM[CUREXP].HH.B0=0 THEN B:=L{:931};Q:=CUREXP;
WHILE A>=65536 DO BEGIN Q:=MEM[Q].HH.RH;A:=A-65536;B:=B-65536;END;
IF B<=A THEN{933:}BEGIN IF A>0 THEN BEGIN MEM[MEM[Q].HH.RH].HH.B1:=1;
SPLITCUBIC(Q,A*4096);Q:=MEM[Q].HH.RH;END;PP:=COPYKNOT(Q);QQ:=PP;
END{:933}ELSE{932:}BEGIN PP:=COPYKNOT(Q);QQ:=PP;REPEAT Q:=MEM[Q].HH.RH;
RR:=QQ;QQ:=COPYKNOT(Q);MEM[RR].HH.RH:=QQ;B:=B-65536;UNTIL B<=0;
IF A>0 THEN BEGIN MEM[MEM[PP].HH.RH].HH.B1:=1;SPLITCUBIC(PP,A*4096);
SS:=PP;PP:=MEM[PP].HH.RH;FREENODE(SS,7);
IF RR=SS THEN BEGIN B:=MAKESCALED(B,65536-A);RR:=PP;END;END;
IF B<0 THEN BEGIN MEM[QQ].HH.B1:=1;SPLITCUBIC(RR,(B+65536)*4096);
FREENODE(QQ,7);QQ:=MEM[RR].HH.RH;END;END{:932};MEM[PP].HH.B0:=0;
MEM[QQ].HH.B1:=0;MEM[QQ].HH.RH:=PP;TOSSKNOTLIST(CUREXP);CUREXP:=PP;END;
{:930}{934:}PROCEDURE PAIRVALUE(X,Y:SCALED);VAR P:HALFWORD;
BEGIN P:=GETNODE(2);FLUSHCUREXP(P);CURTYPE:=14;MEM[P].HH.B0:=14;
MEM[P].HH.B1:=11;INITBIGNODE(P);P:=MEM[P+1].INT;MEM[P].HH.B0:=15;
MEM[P+1].INT:=X;MEM[P+2].HH.B0:=15;MEM[P+3].INT:=Y;END;{:934}{936:}
PROCEDURE SETUPOFFSET(P:HALFWORD);
BEGIN FINDOFFSET(MEM[P+1].INT,MEM[P+3].INT,CUREXP);PAIRVALUE(CURX,CURY);
END;PROCEDURE SETUPDIRECTI(P:HALFWORD);
BEGIN FLUSHCUREXP(FINDDIRECTIO(MEM[P+1].INT,MEM[P+3].INT,CUREXP));END;
{:936}{937:}PROCEDURE FINDPOINT(V:SCALED;C:QUARTERWORD);VAR P:HALFWORD;
N:SCALED;VV:SCALED;BEGIN VV:=V;P:=CUREXP;
IF MEM[P].HH.B0=0 THEN N:=-65536 ELSE N:=0;REPEAT P:=MEM[P].HH.RH;
N:=N+65536;UNTIL P=CUREXP;
IF N=0 THEN V:=0 ELSE IF V<0 THEN IF MEM[P].HH.B0=0 THEN V:=0 ELSE V:=N
-1-((-V-1)MOD N)ELSE IF V>N THEN IF MEM[P].HH.B0=0 THEN V:=N ELSE V:=V
MOD N;P:=CUREXP;WHILE V>=65536 DO BEGIN P:=MEM[P].HH.RH;V:=V-65536;END;
IF V<>0 THEN{938:}BEGIN MEM[MEM[P].HH.RH].HH.B1:=1;SPLITCUBIC(P,V*4096);
P:=MEM[P].HH.RH;END{:938};{939:}
CASE C OF 94:PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT);
95:IF MEM[P].HH.B0=0 THEN PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT)ELSE
PAIRVALUE(MEM[P+3].INT,MEM[P+4].INT);
96:IF MEM[P].HH.B1=0 THEN PAIRVALUE(MEM[P+1].INT,MEM[P+2].INT)ELSE
PAIRVALUE(MEM[P+5].INT,MEM[P+6].INT);END{:939};END;{:937}
PROCEDURE DOBINARY(P:HALFWORD;C:QUARTERWORD);LABEL 30,10;
VAR Q,R:HALFWORD;OLDP,OLDEXP:HALFWORD;V:INTEGER;
BEGIN BEGIN IF ARITHERROR THEN CLEARARITH;END;
IF INTERNAL[6]>131072 THEN{877:}BEGIN BEGINDIAGNOS;PRINTNL(696);
PRINTEXP(P,0);PRINTCHAR(41);PRINTOP(C);PRINTCHAR(40);PRINTEXP(0,0);
PRINT(688);ENDDIAGNOSTI(FALSE);END{:877};{879:}
CASE MEM[P].HH.B0 OF 13,14:OLDP:=TARNISHED(P);19:OLDP:=1;
OTHERS:OLDP:=0 END;IF OLDP<>0 THEN BEGIN Q:=STASHCUREXP;OLDP:=P;
MAKEEXPCOPY(OLDP);P:=STASHCUREXP;UNSTASHCUREX(Q);END;
CASE CURTYPE OF 13,14:OLDEXP:=TARNISHED(CUREXP);19:OLDEXP:=1;
OTHERS:OLDEXP:=0 END;IF OLDEXP<>0 THEN BEGIN OLDEXP:=CUREXP;
MAKEEXPCOPY(OLDEXP);END{:879};CASE C OF 67,68:{882:}
IF(CURTYPE<14)OR(MEM[P].HH.B0<14)THEN IF(CURTYPE=9)AND(MEM[P].HH.B0=9)
THEN BEGIN IF C=68 THEN NEGATEEDGES(CUREXP);CUREDGES:=CUREXP;
MERGEEDGES(MEM[P+1].INT);
END ELSE BADBINARY(P,C)ELSE IF CURTYPE=14 THEN IF MEM[P].HH.B0<>14 THEN
BADBINARY(P,C)ELSE BEGIN Q:=MEM[P+1].INT;R:=MEM[CUREXP+1].INT;
ADDORSUBTRAC(Q,R,C);ADDORSUBTRAC(Q+2,R+2,C);
END ELSE IF MEM[P].HH.B0=14 THEN BADBINARY(P,C)ELSE ADDORSUBTRAC(P,0,C){
:882};{889:}
74,75,76,77,78,79:BEGIN IF(CURTYPE>14)AND(MEM[P].HH.B0>14)THEN
ADDORSUBTRAC(P,0,68)ELSE IF CURTYPE<>MEM[P].HH.B0 THEN BEGIN BADBINARY(P
,C);GOTO 30;
END ELSE IF CURTYPE=4 THEN FLUSHCUREXP(STRVSSTR(MEM[P+1].INT,CUREXP))
ELSE IF(CURTYPE=5)OR(CURTYPE=3)THEN{891:}BEGIN Q:=MEM[CUREXP+1].INT;
WHILE(Q<>CUREXP)AND(Q<>P)DO Q:=MEM[Q+1].INT;IF Q=P THEN FLUSHCUREXP(0);
END{:891}ELSE IF CURTYPE=14 THEN{892:}BEGIN Q:=MEM[P+1].INT;
R:=MEM[CUREXP+1].INT;ADDORSUBTRAC(Q,R,68);
IF MEM[R].HH.B0=15 THEN IF MEM[R+1].INT=0 THEN BEGIN ADDORSUBTRAC(Q+2,R
+2,68);TAKEPART(52);END ELSE TAKEPART(51)ELSE TAKEPART(51);END{:892}
ELSE IF CURTYPE=2 THEN FLUSHCUREXP(CUREXP-MEM[P+1].INT)ELSE BEGIN
BADBINARY(P,C);GOTO 30;END;{890:}
IF CURTYPE<>15 THEN BEGIN IF CURTYPE<15 THEN BEGIN DISPERR(P,312);
BEGIN HELPPTR:=1;HELPLINE[0]:=697;END END ELSE BEGIN HELPPTR:=2;
HELPLINE[1]:=698;HELPLINE[0]:=699;END;DISPERR(0,700);PUTGETFLUSHE(31);
END ELSE CASE C OF 74:IF CUREXP<0 THEN CUREXP:=30 ELSE CUREXP:=31;
75:IF CUREXP<=0 THEN CUREXP:=30 ELSE CUREXP:=31;
76:IF CUREXP>0 THEN CUREXP:=30 ELSE CUREXP:=31;
77:IF CUREXP>=0 THEN CUREXP:=30 ELSE CUREXP:=31;
78:IF CUREXP=0 THEN CUREXP:=30 ELSE CUREXP:=31;
79:IF CUREXP<>0 THEN CUREXP:=30 ELSE CUREXP:=31;END;CURTYPE:=2{:890};
30:END;{:889}{893:}
73,72:IF(MEM[P].HH.B0<>2)OR(CURTYPE<>2)THEN BADBINARY(P,C)ELSE IF MEM[P
+1].INT=C-42 THEN CUREXP:=MEM[P+1].INT;{:893}{894:}
69:IF(CURTYPE<14)OR(MEM[P].HH.B0<14)THEN BADBINARY(P,69)ELSE IF(CURTYPE=
15)OR(MEM[P].HH.B0=15)THEN{895:}
BEGIN IF MEM[P].HH.B0=15 THEN BEGIN V:=MEM[P+1].INT;FREENODE(P,2);
END ELSE BEGIN V:=CUREXP;UNSTASHCUREX(P);END;
IF CURTYPE=15 THEN CUREXP:=TAKESCALED(CUREXP,V)ELSE IF CURTYPE=14 THEN
BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,TRUE);DEPMULT(P+2,V,TRUE);
END ELSE DEPMULT(0,V,TRUE);GOTO 10;END{:895}
ELSE IF(NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE>14))OR(NICEPAIR(CUREXP,
CURTYPE)AND(MEM[P].HH.B0>14))THEN BEGIN HARDTIMES(P);GOTO 10;
END ELSE BADBINARY(P,69);{:894}{901:}
70:IF(CURTYPE<>15)OR(MEM[P].HH.B0<14)THEN BADBINARY(P,70)ELSE BEGIN V:=
CUREXP;UNSTASHCUREX(P);IF V=0 THEN{903:}BEGIN DISPERR(0,631);
BEGIN HELPPTR:=2;HELPLINE[1]:=702;HELPLINE[0]:=703;END;PUTGETERROR;
END{:903}
ELSE BEGIN IF CURTYPE=15 THEN CUREXP:=MAKESCALED(CUREXP,V)ELSE IF
CURTYPE=14 THEN BEGIN P:=MEM[CUREXP+1].INT;DEPDIV(P,V);DEPDIV(P+2,V);
END ELSE DEPDIV(0,V);END;GOTO 10;END;{:901}{904:}
71:IF(CURTYPE=15)AND(MEM[P].HH.B0=15)THEN CUREXP:=PYTHADD(MEM[P+1].INT,
CUREXP)ELSE BADBINARY(P,71);{:904}{905:}
81,82,83,84,85,86,87,88:IF(MEM[P].HH.B0=11)OR(MEM[P].HH.B0=8)THEN BEGIN
PATHTRANS(P,C);GOTO 10;
END ELSE IF(MEM[P].HH.B0=14)OR(MEM[P].HH.B0=13)THEN BIGTRANS(P,C)ELSE IF
MEM[P].HH.B0=9 THEN BEGIN EDGESTRANS(P,C);GOTO 10;
END ELSE BADBINARY(P,C);{:905}{927:}
80:IF(CURTYPE=4)AND(MEM[P].HH.B0=4)THEN CAT(P)ELSE BADBINARY(P,80);
91:IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=4)THEN CHOPSTRING(MEM[P+1].INT
)ELSE BADBINARY(P,91);92:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF NICEPAIR(P,MEM[P].HH.B0)AND(CURTYPE=11)THEN CHOPPATH(MEM[P+1].INT)
ELSE BADBINARY(P,92);END;{:927}{935:}
94,95,96:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF(CURTYPE=11)AND(MEM[P].HH.B0=15)THEN FINDPOINT(MEM[P+1].INT,C)ELSE
BADBINARY(P,C);END;
97:IF(CURTYPE=6)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPOFFSET(MEM[P+1].
INT)ELSE BADBINARY(P,97);93:BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF(CURTYPE=11)AND NICEPAIR(P,MEM[P].HH.B0)THEN SETUPDIRECTI(MEM[P+1].INT
)ELSE BADBINARY(P,93);END;{:935}{940:}
89:BEGIN IF MEM[P].HH.B0=14 THEN BEGIN Q:=STASHCUREXP;UNSTASHCUREX(P);
PAIRTOPATH;P:=STASHCUREXP;UNSTASHCUREX(Q);END;
IF CURTYPE=14 THEN PAIRTOPATH;
IF(CURTYPE=11)AND(MEM[P].HH.B0=11)THEN BEGIN PATHINTERSEC(MEM[P+1].INT,
CUREXP);PAIRVALUE(CURT,CURTT);END ELSE BADBINARY(P,89);END;{:940}END;
RECYCLEVALUE(P);FREENODE(P,2);10:BEGIN IF ARITHERROR THEN CLEARARITH;
END;{878:}IF OLDP<>0 THEN BEGIN RECYCLEVALUE(OLDP);FREENODE(OLDP,2);END;
IF OLDEXP<>0 THEN BEGIN RECYCLEVALUE(OLDEXP);FREENODE(OLDEXP,2);
END{:878};END;{:875}{897:}PROCEDURE FRACMULT(N,D:SCALED);VAR P:HALFWORD;
OLDEXP:HALFWORD;V:FRACTION;BEGIN IF INTERNAL[6]>131072 THEN{898:}
BEGIN BEGINDIAGNOS;PRINTNL(696);PRINTSCALED(N);PRINTCHAR(47);
PRINTSCALED(D);PRINT(701);PRINTEXP(0,0);PRINT(688);ENDDIAGNOSTI(FALSE);
END{:898};CASE CURTYPE OF 13,14:OLDEXP:=TARNISHED(CUREXP);19:OLDEXP:=1;
OTHERS:OLDEXP:=0 END;IF OLDEXP<>0 THEN BEGIN OLDEXP:=CUREXP;
MAKEEXPCOPY(OLDEXP);END;V:=MAKEFRACTION(N,D);
IF CURTYPE=15 THEN CUREXP:=TAKEFRACTION(CUREXP,V)ELSE IF CURTYPE=14 THEN
BEGIN P:=MEM[CUREXP+1].INT;DEPMULT(P,V,FALSE);DEPMULT(P+2,V,FALSE);
END ELSE DEPMULT(0,V,FALSE);
IF OLDEXP<>0 THEN BEGIN RECYCLEVALUE(OLDEXP);FREENODE(OLDEXP,2);END END;
{:897}{941:}{1101:}PROCEDURE ARYOUT(VAR F:FILE;B:PACKEDBYTES;
O,C:INTEGER);EXTERN;PROCEDURE WRITEGF(A,B:GFINDEX);
BEGIN ARYOUT(GFFILE,GFBUF,A DIV 4,(B+1-A)DIV 4);{+1000}END;{:1101}
{1102:}PROCEDURE GFSWAP;
BEGIN IF GFLIMIT=GFBUFSIZE THEN BEGIN WRITEGF(0,HALFBUF-1);
GFLIMIT:=HALFBUF;GFOFFSET:=GFOFFSET+GFBUFSIZE;GFPTR:=0;
END ELSE BEGIN WRITEGF(HALFBUF,GFBUFSIZE-1);GFLIMIT:=GFBUFSIZE;END;END;
{:1102}{1104:}PROCEDURE GFFOUR(X:INTEGER);
BEGIN IF X>=0 THEN BEGIN GFBUF[GFPTR]:=X DIV 16777216;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN X:=X+1073741824;
X:=X+1073741824;BEGIN GFBUF[GFPTR]:=(X DIV 16777216)+128;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;X:=X MOD 16777216;
BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;X:=X MOD 65536;
BEGIN GFBUF[GFPTR]:=X DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1104}{1105:}
PROCEDURE GFTWO(X:INTEGER);BEGIN BEGIN GFBUF[GFPTR]:=X DIV 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=X MOD 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END;PROCEDURE GFTHREE(X:INTEGER);
BEGIN BEGIN GFBUF[GFPTR]:=X DIV 65536;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(X MOD 65536)DIV 256;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=X MOD 256;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1105}{1106:}
PROCEDURE GFPAINT(D:INTEGER);BEGIN IF D<64 THEN BEGIN GFBUF[GFPTR]:=0+D;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF D<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=64;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=65;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(D);END;END;
PROCEDURE GFNEWROW(D:INTEGER);
BEGIN IF ABS(D)<=82 THEN BEGIN GFBUF[GFPTR]:=156+D;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END ELSE BEGIN BEGIN GFBUF[GFPTR]:=72;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(D);END;END;
{:1106}{1107:}PROCEDURE GFSTRING(S:STRNUMBER);VAR K:POOLPOINTER;
BEGIN FOR K:=STRSTART[S]TO STRSTART[S+1]-1 DO BEGIN GFBUF[GFPTR]:=
STRPOOL[K];GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;END;{:1107}
{1108:}PROCEDURE INITGF;VAR K:EIGHTBITS;T:INTEGER;BEGIN GFMINX:=4096;
GFMAXX:=-4096;GFMINY:=4096;GFMAXY:=-4096;
FOR K:=0 TO 255 DO CHARPTR[K]:=-1;BEGIN IF JOBNAME=0 THEN OPENLOGFILE;
PACKJOBNAME(602);WHILE NOT BOPENOUT(GFFILE)DO PROMPTFILENA(603,602);
OUTPUTFILENA:=BMAKENAMESTR(GFFILE);END;BEGIN GFBUF[GFPTR]:=247;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=129;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;OLDSETTING:=SELECTOR;
SELECTOR:=5;PRINT(889);PRINTINT(ROUNDUNSCALE(INTERNAL[12]));
PRINTCHAR(46);PRINTDD(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(46);
PRINTDD(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(58);
T:=ROUNDUNSCALE(INTERNAL[15]);PRINTDD(T DIV 60);PRINTDD(T MOD 60);
SELECTOR:=OLDSETTING;BEGIN GFBUF[GFPTR]:=(POOLPTR-STRSTART[STRPTR]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
STRSTART[STRPTR+1]:=POOLPTR;GFSTRING(STRPTR);POOLPTR:=STRSTART[STRPTR];
GFPREVPTR:=GFOFFSET+GFPTR;END;{:1108}{1109:}
PROCEDURE SHIPOUT(C:EIGHTBITS);VAR F:INTEGER;PREVM,M,MM:INTEGER;
MMM:INTEGER;PREVN,N:INTEGER;P,Q:HALFWORD;PREVW,W,WW:INTEGER;D:INTEGER;
DELTA:INTEGER;Z:INTEGER;BEGIN IF OUTPUTFILENA=0 THEN INITGF;
F:=ROUNDUNSCALE(INTERNAL[17]);
IF TERMOFFSET>MAXPRINTLINE-9 THEN PRINTLN ELSE IF(TERMOFFSET>0)OR(
FILEOFFSET>0)THEN PRINTCHAR(32);PRINTCHAR(91);PRINTINT(C);
IF F<>0 THEN BEGIN PRINTCHAR(46);PRINTINT(F);END;BREAK(TTY);
BEGIN GFBUF[GFPTR]:=67;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFFOUR(256*F+C);GFFOUR(CHARPTR[C]);CHARPTR[C]:=GFPREVPTR;{1110:}
PREVN:=4096;P:=MEM[CUREDGES].HH.LH;N:=MEM[CUREDGES+1].HH.RH-4096;
WHILE P<>CUREDGES DO BEGIN{1111:}IF MEM[P+1].HH.LH>1 THEN SORTEDGES(P);
Q:=MEM[P+1].HH.RH;W:=0;PREVM:=-268435456;WW:=0;PREVW:=0;M:=PREVM;
REPEAT IF Q=26000 THEN MM:=268435456 ELSE BEGIN D:=MEM[Q].HH.LH;
MM:=D DIV 8;WW:=WW+(D MOD 8)-4;END;
IF MM<>M THEN BEGIN IF PREVW<=0 THEN BEGIN IF W>0 THEN{1112:}
BEGIN IF PREVM=-268435456 THEN{1114:}BEGIN MMM:=M-MEM[CUREDGES+3].HH.LH;
IF MMM<GFMINX THEN GFMINX:=MMM;
IF PREVN=4096 THEN BEGIN IF N>GFMAXY THEN GFMAXY:=N;
GFFOUR(MEM[CUREDGES+2].HH.LH-4096);GFFOUR(MEM[CUREDGES+2].HH.RH-4097);
GFFOUR(MEM[CUREDGES+1].HH.LH-4096);GFFOUR(N);GFFOUR(MMM);
END ELSE IF PREVN>N+1 THEN{1115:}BEGIN DELTA:=PREVN-N-1;
IF M<>Z THEN BEGIN GFNEWROW(M-Z);DELTA:=DELTA-1;END;
IF DELTA<256 THEN BEGIN BEGIN GFBUF[GFPTR]:=69;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=DELTA;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=70;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFTWO(DELTA);END;END{:1115}
ELSE GFNEWROW(M-Z);Z:=M;PREVN:=N;END{:1114}ELSE GFPAINT(M-PREVM);
PREVM:=M;PREVW:=W;END{:1112};END ELSE IF W<=0 THEN{1113:}
BEGIN GFPAINT(M-PREVM);PREVM:=M;PREVW:=W;END{:1113};M:=MM;END;W:=WW;
Q:=MEM[Q].HH.RH;UNTIL MM=268435456;IF W<>0 THEN PRINTNL(891);
IF PREVM-MEM[CUREDGES+3].HH.LH>GFMAXX THEN GFMAXX:=PREVM-MEM[CUREDGES+3]
.HH.LH{:1111};P:=MEM[P].HH.LH;N:=N-1;END;
IF PREVN=4096 THEN FOR N:=1 TO 20 DO BEGIN GFBUF[GFPTR]:=0;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;
END ELSE IF PREVN<GFMINY THEN GFMINY:=PREVN{:1110};
BEGIN GFBUF[GFPTR]:=68;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFPREVPTR:=GFOFFSET+GFPTR;TOTALCHARS:=TOTALCHARS+1;PRINTCHAR(93);
BREAK(TTY);IF INTERNAL[9]>0 THEN PRINTEDGES(890);END;{:1109}{947:}{958:}
PROCEDURE TRYEQ(L,R:HALFWORD);LABEL 30,31;VAR P:HALFWORD;T:15..19;
Q:HALFWORD;PP:HALFWORD;TT:16..19;COPIED:BOOLEAN;BEGIN{959:}
T:=MEM[L].HH.B0;IF T=15 THEN BEGIN T:=16;P:=CONSTDEPENDE(-MEM[L+1].INT);
Q:=P;END ELSE IF T=19 THEN BEGIN T:=16;P:=SINGLEDEPEND(L);
MEM[P+1].INT:=-MEM[P+1].INT;Q:=DEPFINAL;
END ELSE BEGIN P:=MEM[L+1].HH.RH;Q:=P;
WHILE TRUE DO BEGIN MEM[Q+1].INT:=-MEM[Q+1].INT;
IF MEM[Q].HH.LH=0 THEN GOTO 30;Q:=MEM[Q].HH.RH;END;
30:MEM[MEM[L+1].HH.LH].HH.RH:=MEM[Q].HH.RH;
MEM[MEM[Q].HH.RH+1].HH.LH:=MEM[L+1].HH.LH;MEM[L].HH.B0:=15;END{:959};
{961:}
IF R=0 THEN IF CURTYPE=15 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+CUREXP;
GOTO 31;END ELSE BEGIN TT:=CURTYPE;
IF TT=19 THEN PP:=SINGLEDEPEND(CUREXP)ELSE PP:=MEM[CUREXP+1].HH.RH;
END ELSE IF MEM[R].HH.B0=15 THEN BEGIN MEM[Q+1].INT:=MEM[Q+1].INT+MEM[R
+1].INT;GOTO 31;END ELSE BEGIN TT:=MEM[R].HH.B0;
IF TT=19 THEN PP:=SINGLEDEPEND(R)ELSE PP:=MEM[R+1].HH.RH;END;
IF TT<>19 THEN COPIED:=FALSE ELSE BEGIN COPIED:=TRUE;TT:=16;END;{962:}
WATCHCOEFS:=FALSE;
IF T=TT THEN P:=PPLUSQ(P,PP,T)ELSE IF T=17 THEN P:=PPLUSFQ(P,65536,PP,17
,16)ELSE BEGIN Q:=P;
WHILE MEM[Q].HH.LH<>0 DO BEGIN MEM[Q+1].INT:=ROUNDFRACTIO(MEM[Q+1].INT);
Q:=MEM[Q].HH.RH;END;T:=17;P:=PPLUSQ(P,PP,T);END;WATCHCOEFS:=TRUE;{:962};
IF COPIED THEN FLUSHNODELIS(PP);31:{:961};IF MEM[P].HH.LH=0 THEN{960:}
BEGIN IF MEM[P+1].INT<>0 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(744);END;PRINT(746);
PRINTSCALED(MEM[P+1].INT);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=745;HELPLINE[0]:=743;END;PUTGETERROR;
END ELSE IF R=0 THEN{580:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(441);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=442;HELPLINE[0]:=443;END;PUTGETERROR;
END{:580};FREENODE(P,2);END{:960}ELSE BEGIN LINEAREQ(P,T);
IF R=0 THEN IF CURTYPE<>15 THEN IF MEM[CUREXP].HH.B0=15 THEN BEGIN PP:=
CUREXP;CUREXP:=MEM[CUREXP+1].INT;CURTYPE:=15;FREENODE(PP,2);END;END;END;
{:958}{953:}PROCEDURE MAKEEQ(LHS:HALFWORD);LABEL 20,30,45;
VAR T:SMALLNUMBER;V:INTEGER;P,Q:HALFWORD;BEGIN 20:T:=MEM[LHS].HH.B0;
IF T<=14 THEN V:=MEM[LHS+1].INT;CASE T OF{955:}
2,4,6,9,11:IF CURTYPE=T+1 THEN BEGIN NONLINEAREQ(V,CUREXP,FALSE);
GOTO 30;END ELSE IF CURTYPE=T THEN{956:}
BEGIN IF CURTYPE<=4 THEN BEGIN IF CURTYPE=4 THEN BEGIN IF STRVSSTR(V,
CUREXP)<>0 THEN GOTO 45;END ELSE IF V<>CUREXP THEN GOTO 45;{580:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(441);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=442;HELPLINE[0]:=443;END;PUTGETERROR;
END{:580};GOTO 30;END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(741);END;BEGIN HELPPTR:=2;HELPLINE[1]:=742;
HELPLINE[0]:=743;END;PUTGETERROR;GOTO 30;
45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(744);END;
BEGIN HELPPTR:=2;HELPLINE[1]:=745;HELPLINE[0]:=743;END;PUTGETERROR;
GOTO 30;END{:956};
3,5,7,10,12:IF CURTYPE=T-1 THEN BEGIN NONLINEAREQ(CUREXP,LHS,TRUE);
GOTO 30;END ELSE IF CURTYPE=T THEN BEGIN RINGMERGE(LHS,CUREXP);GOTO 30;
END ELSE IF CURTYPE=14 THEN IF T=12 THEN BEGIN PAIRTOPATH;GOTO 20;END;
13,14:IF CURTYPE=T THEN{957:}BEGIN P:=V+BIGNODESIZE[T];
Q:=MEM[CUREXP+1].INT+BIGNODESIZE[T];REPEAT P:=P-2;Q:=Q-2;TRYEQ(P,Q);
UNTIL P=V;GOTO 30;END{:957};
15,16,17,19:IF CURTYPE>=15 THEN BEGIN TRYEQ(LHS,0);GOTO 30;END;1:;{:955}
END;{954:}DISPERR(LHS,312);DISPERR(0,738);
IF MEM[LHS].HH.B0<=14 THEN PRINTTYPE(MEM[LHS].HH.B0)ELSE PRINT(214);
PRINTCHAR(61);IF CURTYPE<=14 THEN PRINTTYPE(CURTYPE)ELSE PRINT(214);
PRINTCHAR(41);BEGIN HELPPTR:=2;HELPLINE[1]:=739;HELPLINE[0]:=740;END;
PUTGETERROR{:954};30:BEGIN IF ARITHERROR THEN CLEARARITH;END;
RECYCLEVALUE(LHS);FREENODE(LHS,2);END;{:953}PROCEDURE DOASSIGNMENT;
FORWARD;PROCEDURE DOEQUATION;VAR LHS:HALFWORD;P:HALFWORD;
BEGIN LHS:=STASHCUREXP;GETXNEXT;VARFLAG:=76;SCANEXPRESSI;
IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76 THEN DOASSIGNMENT;
IF INTERNAL[6]>131072 THEN{949:}BEGIN BEGINDIAGNOS;PRINTNL(696);
PRINTEXP(LHS,0);PRINT(733);PRINTEXP(0,0);PRINT(688);ENDDIAGNOSTI(FALSE);
END{:949};
IF CURTYPE=12 THEN IF MEM[LHS].HH.B0=14 THEN BEGIN P:=STASHCUREXP;
UNSTASHCUREX(LHS);LHS:=P;END;MAKEEQ(LHS);END;{:947}{948:}
PROCEDURE DOASSIGNMENT;VAR LHS:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN IF CURTYPE<>20 THEN BEGIN DISPERR(0,730);BEGIN HELPPTR:=2;
HELPLINE[1]:=731;HELPLINE[0]:=732;END;ERROR;DOEQUATION;
END ELSE BEGIN LHS:=CUREXP;CURTYPE:=1;GETXNEXT;VARFLAG:=76;SCANEXPRESSI;
IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76 THEN DOASSIGNMENT;
IF INTERNAL[6]>131072 THEN{950:}BEGIN BEGINDIAGNOS;PRINTNL(123);
IF MEM[LHS].HH.LH>2243 THEN PRINT(INTNAME[MEM[LHS].HH.LH-(2243)])ELSE
SHOWTOKENLIS(LHS,0,1000);PRINT(323);PRINTEXP(0,0);PRINTCHAR(125);
ENDDIAGNOSTI(FALSE);END{:950};IF MEM[LHS].HH.LH>2243 THEN{951:}
IF CURTYPE=15 THEN INTERNAL[MEM[LHS].HH.LH-(2243)]:=CUREXP ELSE BEGIN
DISPERR(0,734);PRINT(INTNAME[MEM[LHS].HH.LH-(2243)]);PRINT(735);
BEGIN HELPPTR:=2;HELPLINE[1]:=736;HELPLINE[0]:=737;END;PUTGETERROR;
END{:951}ELSE{952:}BEGIN P:=FINDVARIABLE(LHS);
IF P<>0 THEN BEGIN Q:=STASHCUREXP;CURTYPE:=UNDTYPE(P);RECYCLEVALUE(P);
MEM[P].HH.B0:=CURTYPE;MEM[P+1].INT:=0;MAKEEXPCOPY(P);P:=STASHCUREXP;
UNSTASHCUREX(Q);MAKEEQ(P);END ELSE BEGIN OBLITERATED(LHS);PUTGETERROR;
END;END{:952};FLUSHNODELIS(LHS);END;END;{:948}{967:}
PROCEDURE DOTYPEDECLAR;VAR T:SMALLNUMBER;P:HALFWORD;Q:HALFWORD;
BEGIN IF CURMOD>=13 THEN T:=CURMOD ELSE T:=CURMOD+1;
REPEAT P:=SCANDECLARED;
FLUSHVARIABL(EQTB[MEM[P].HH.LH].RH,MEM[P].HH.RH,FALSE);
Q:=FINDVARIABLE(P);MEM[Q].HH.B0:=T;MEM[Q+1].INT:=0;FLUSHLIST(P);
IF CURCMD<78 THEN{968:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(747);END;BEGIN HELPPTR:=5;HELPLINE[4]:=748;
HELPLINE[3]:=749;HELPLINE[2]:=750;HELPLINE[1]:=751;HELPLINE[0]:=752;END;
IF CURCMD=40 THEN HELPLINE[2]:=753;PUTGETERROR;SCANNERSTATU:=2;
REPEAT GETNEXT;{697:}
IF CURCMD=41 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:697}
;UNTIL CURCMD>=78;SCANNERSTATU:=0;END{:968};UNTIL CURCMD>78;END;{:967}
{973:}PROCEDURE DORANDOMSEED;BEGIN GETXNEXT;
IF CURCMD<>76 THEN BEGIN MISSINGERR(323);BEGIN HELPPTR:=1;
HELPLINE[0]:=758;END;BACKERROR;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BEGIN DISPERR(0,759);BEGIN HELPPTR:=2;
HELPLINE[1]:=760;HELPLINE[0]:=761;END;PUTGETFLUSHE(0);
END ELSE INITRANDOMS(CUREXP);END;{:973}{980:}PROCEDURE DOPROTECTION;
VAR M:0..1;T:HALFWORD;BEGIN M:=CURMOD;REPEAT GETSYMBOL;
T:=EQTB[CURSYM].LH;
IF M=0 THEN BEGIN IF T>=82 THEN EQTB[CURSYM].LH:=T-82;
END ELSE IF T<82 THEN EQTB[CURSYM].LH:=T+82;GETNEXT;UNTIL CURCMD<>78;
END;{:980}{982:}PROCEDURE DEFDELIMS;VAR LDELIM,RDELIM:HALFWORD;
BEGIN GETCLEARSYMB;LDELIM:=CURSYM;GETCLEARSYMB;RDELIM:=CURSYM;
EQTB[LDELIM].LH:=30;EQTB[LDELIM].RH:=RDELIM;EQTB[RDELIM].LH:=62;
EQTB[RDELIM].RH:=LDELIM;GETNEXT;END;{:982}{985:}PROCEDURE DOSTATEMENT;
FORWARD;PROCEDURE DOINTERIM;BEGIN GETNEXT;
IF CURCMD<>38 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(767);END;PRINTCMDMOD(CURCMD,CURMOD);PRINT(772);
BEGIN HELPPTR:=1;HELPLINE[0]:=773;END;BACKERROR;
END ELSE BEGIN SAVEINTERNAL(CURMOD);BACKINPUT;END;DOSTATEMENT;END;{:985}
{986:}PROCEDURE DOLET;VAR L:HALFWORD;BEGIN GETSYMBOL;L:=CURSYM;GETNEXT;
IF(CURCMD<>50)AND(CURCMD<>76)THEN BEGIN MISSINGERR(61);BEGIN HELPPTR:=3;
HELPLINE[2]:=774;HELPLINE[1]:=515;HELPLINE[0]:=775;END;BACKERROR;END;
GETSYMBOL;
CASE CURCMD OF 8,53,43,48:MEM[CURMOD].HH.LH:=MEM[CURMOD].HH.LH+1;
OTHERS:END;CLEARSYMBOL(L,FALSE);EQTB[L].LH:=CURCMD;
IF CURCMD=39 THEN EQTB[L].RH:=0 ELSE EQTB[L].RH:=CURMOD;GETNEXT;END;
{:986}{987:}PROCEDURE DONEWINTERNA;
BEGIN REPEAT IF INTPTR=MAXINTERNAL THEN OVERFLOW(776,MAXINTERNAL);
GETCLEARSYMB;INTPTR:=INTPTR+1;EQTB[CURSYM].LH:=38;
EQTB[CURSYM].RH:=INTPTR;INTNAME[INTPTR]:=HASH[CURSYM].RH;
INTERNAL[INTPTR]:=0;GETNEXT;UNTIL CURCMD<>78;END;{:987}{991:}
PROCEDURE DOSHOW;VAR VERBOSITY:SMALLNUMBER;BEGIN VERBOSITY:=CURMOD-1;
REPEAT GETXNEXT;SCANEXPRESSI;PRINTNL(612);PRINTEXP(0,VERBOSITY);
FLUSHCUREXP(0);UNTIL CURCMD<>78;END;{:991}{992:}PROCEDURE DISPTOKEN;
BEGIN PRINTNL(786);IF CURSYM=0 THEN{993:}
BEGIN IF CURCMD=40 THEN PRINTSCALED(CURMOD)ELSE BEGIN PRINTCHAR(34);
PRINT(CURMOD);PRINTCHAR(34);
BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1 THEN STRREF[CURMOD]
:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END;END;END{:993}
ELSE IF CURSYM>2243 THEN PRINT(787)ELSE BEGIN PRINT(HASH[CURSYM].RH);
PRINTCHAR(61);IF EQTB[CURSYM].LH>=82 THEN PRINT(788);
PRINTCMDMOD(CURCMD,CURMOD);IF CURCMD=8 THEN BEGIN PRINTLN;
SHOWMACRO(CURMOD,0,100000);END;END;END;{:992}{995:}
PROCEDURE DOSHOWTOKEN;BEGIN REPEAT GETNEXT;DISPTOKEN;GETNEXT;
UNTIL CURCMD<>78;END;{:995}{996:}PROCEDURE DOSHOWSTATS;
BEGIN PRINTNL(797);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED);
PRINT(798);PRINTINT(MAXVARUSED);PRINTCHAR(38);PRINTINT(MEMEND-25999);
PRINTCHAR(41);IF FALSE THEN PRINT(799);PRINTNL(800);
PRINTINT(STRPTR-INITSTRPTR);PRINTCHAR(38);PRINTINT(POOLPTR-INITPOOLPTR);
PRINT(798);PRINTINT(MAXSTRPTR-INITSTRPTR);PRINTCHAR(38);
PRINTINT(MAXPOOLPTR-INITPOOLPTR);PRINTCHAR(41);GETNEXT;END;{:996}{997:}
PROCEDURE DISPVAR(P:HALFWORD);VAR Q:HALFWORD;N:0..MAXPRINTLINE;
BEGIN IF MEM[P].HH.B0=21 THEN{998:}BEGIN Q:=MEM[P+1].HH.LH;
REPEAT DISPVAR(Q);Q:=MEM[Q].HH.RH;UNTIL Q=21;Q:=MEM[P+1].HH.RH;
WHILE MEM[Q].HH.B1=3 DO BEGIN DISPVAR(Q);Q:=MEM[Q].HH.RH;END;END{:998}
ELSE IF MEM[P].HH.B0>=22 THEN{999:}BEGIN PRINTNL(312);PRINTVARIABL(P);
IF MEM[P].HH.B0>22 THEN PRINT(507);PRINT(801);
IF FILEOFFSET>=MAXPRINTLINE-20 THEN N:=5 ELSE N:=MAXPRINTLINE-FILEOFFSET
-15;SHOWMACRO(MEM[P+1].INT,0,N);END{:999}
ELSE IF MEM[P].HH.B0<>0 THEN BEGIN PRINTNL(312);PRINTVARIABL(P);
PRINTCHAR(61);PRINTEXP(P,0);END;END;{:997}{1000:}PROCEDURE DOSHOWVAR;
LABEL 30;BEGIN REPEAT GETNEXT;
IF CURSYM>0 THEN IF CURSYM<=2243 THEN IF CURCMD=39 THEN IF CURMOD<>0
THEN BEGIN DISPVAR(CURMOD);GOTO 30;END;DISPTOKEN;30:GETNEXT;
UNTIL CURCMD<>78;END;{:1000}{1001:}
PROCEDURE DOSHOWDEPEND(M:SMALLNUMBER);VAR P:HALFWORD;
BEGIN P:=MEM[13].HH.RH;
WHILE P<>13 DO BEGIN IF INTERESTING(P)OR(M=6)THEN BEGIN PRINTNL(312);
PRINTVARIABL(P);IF MEM[P].HH.B0=16 THEN PRINTCHAR(61)ELSE PRINT(615);
PRINTDEPENDE(MEM[P+1].HH.RH,MEM[P].HH.B0);END;P:=MEM[P+1].HH.RH;
WHILE MEM[P].HH.LH<>0 DO P:=MEM[P].HH.RH;P:=MEM[P].HH.RH;END;GETNEXT;
END;{:1001}{1004:}PROCEDURE FINDEDGESVAR(T:HALFWORD);VAR P:HALFWORD;
BEGIN P:=FINDVARIABLE(T);CUREDGES:=0;IF P=0 THEN BEGIN OBLITERATED(T);
PUTGETERROR;
END ELSE IF MEM[P].HH.B0<>9 THEN BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(637);END;SHOWTOKENLIS(T,0,1000);
PRINT(807);PRINTTYPE(MEM[P].HH.B0);PRINTCHAR(41);BEGIN HELPPTR:=2;
HELPLINE[1]:=808;HELPLINE[0]:=809;END;PUTGETERROR;
END ELSE CUREDGES:=MEM[P+1].INT;FLUSHNODELIS(T);END;{:1004}{1006:}
PROCEDURE DOADDTO;LABEL 30,45;VAR LHS,RHS:HALFWORD;M:SMALLNUMBER;
T:SMALLNUMBER;W,WW:INTEGER;PEN:HALFWORD;P:HALFWORD;Q:HALFWORD;
BEGIN GETXNEXT;VARFLAG:=66;SCANPRIMARY;IF CURTYPE<>20 THEN{1007:}
BEGIN DISPERR(0,810);BEGIN HELPPTR:=4;HELPLINE[3]:=811;HELPLINE[2]:=812;
HELPLINE[1]:=813;HELPLINE[0]:=809;END;PUTGETFLUSHE(0);END{:1007}
ELSE BEGIN LHS:=CUREXP;M:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;
IF M=2 THEN{1008:}BEGIN FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN FLUSHCUREXP(0)ELSE IF CURTYPE<>9 THEN BEGIN DISPERR(0
,814);BEGIN HELPPTR:=2;HELPLINE[1]:=815;HELPLINE[0]:=809;END;
PUTGETFLUSHE(0);END ELSE BEGIN MERGEEDGES(CUREXP);FLUSHCUREXP(0);END;
END{:1008}ELSE{1009:}BEGIN IF CURTYPE=14 THEN PAIRTOPATH;
IF CURTYPE<>11 THEN BEGIN DISPERR(0,814);BEGIN HELPPTR:=2;
HELPLINE[1]:=816;HELPLINE[0]:=809;END;PUTGETFLUSHE(0);FLUSHTOKENLI(LHS);
END ELSE BEGIN RHS:=CUREXP;W:=1;PEN:=3;
WHILE CURCMD=65 DO BEGIN T:=CURMOD;CURTYPE:=1;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>T THEN{1010:}BEGIN DISPERR(0,817);BEGIN HELPPTR:=2;
HELPLINE[1]:=818;HELPLINE[0]:=819;END;IF T=6 THEN HELPLINE[1]:=820;
PUTGETFLUSHE(0);END{:1010}ELSE IF T=15 THEN{1011:}
BEGIN WW:=ROUNDUNSCALE(CUREXP);
IF(ABS(WW)<4)AND(WW<>0)THEN W:=WW ELSE BEGIN BEGIN IF INTERACTION=3 THEN
WAKEUPTERMIN;PRINTNL(133);PRINT(821);END;BEGIN HELPPTR:=1;
HELPLINE[0]:=819;END;PUTGETFLUSHE(0);END;END{:1011}ELSE{1012:}
BEGIN IF MEM[PEN].HH.LH=0 THEN TOSSPEN(PEN)ELSE MEM[PEN].HH.LH:=MEM[PEN]
.HH.LH-1;PEN:=CUREXP;END{:1012};END;{1013:}FINDEDGESVAR(LHS);
IF CUREDGES=0 THEN TOSSKNOTLIST(RHS)ELSE BEGIN LHS:=0;
IF MEM[RHS].HH.B0=0 THEN IF M=1 THEN{1014:}
IF MEM[RHS].HH.RH=RHS THEN{1015:}BEGIN MEM[RHS+5].INT:=MEM[RHS+1].INT;
MEM[RHS+6].INT:=MEM[RHS+2].INT;MEM[RHS+3].INT:=MEM[RHS+1].INT;
MEM[RHS+4].INT:=MEM[RHS+2].INT;MEM[RHS].HH.B0:=1;MEM[RHS].HH.B1:=1;
END{:1015}ELSE BEGIN P:=HTAPYPOC(RHS);Q:=MEM[P].HH.RH;
MEM[PATHTAIL+5].INT:=MEM[Q+5].INT;MEM[PATHTAIL+6].INT:=MEM[Q+6].INT;
MEM[PATHTAIL].HH.B1:=MEM[Q].HH.B1;MEM[PATHTAIL].HH.RH:=MEM[Q].HH.RH;
FREENODE(Q,7);MEM[P+5].INT:=MEM[RHS+5].INT;MEM[P+6].INT:=MEM[RHS+6].INT;
MEM[P].HH.B1:=MEM[RHS].HH.B1;MEM[P].HH.RH:=MEM[RHS].HH.RH;
FREENODE(RHS,7);RHS:=P;END{:1014}ELSE{1016:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(822);
END;BEGIN HELPPTR:=2;HELPLINE[1]:=823;HELPLINE[0]:=809;END;PUTGETERROR;
TOSSKNOTLIST(RHS);GOTO 45;END{:1016}ELSE IF M=1 THEN LHS:=HTAPYPOC(RHS);
CURWT:=W;RHS:=MAKESPEC(RHS,MEM[PEN+9].INT);{1017:}
IF WINDINGNUMBE<=0 THEN IF M<>1 THEN IF INTERNAL[31]>0 THEN IF(
WINDINGNUMBE<0)AND(PEN=3)THEN CURWT:=-CURWT ELSE BEGIN IF WINDINGNUMBE=0
THEN IF(INTERNAL[31]<=65536)AND(PEN=3)THEN GOTO 30 ELSE BEGIN IF
INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(824);
END ELSE BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(825);END;BEGIN HELPPTR:=2;HELPLINE[1]:=826;HELPLINE[0]:=827;END;
PUTGETERROR;END;30:{:1017};
IF PEN=3 THEN FILLSPEC(RHS)ELSE FILLENVELOPE(RHS,PEN);
IF LHS<>0 THEN BEGIN LHS:=MAKESPEC(LHS,MEM[PEN+9].INT);
IF PEN=3 THEN FILLSPEC(LHS)ELSE FILLENVELOPE(LHS,PEN);END;45:END{:1013};
IF MEM[PEN].HH.LH=0 THEN TOSSPEN(PEN)ELSE MEM[PEN].HH.LH:=MEM[PEN].HH.LH
-1;END;END{:1009};END;END;{:1006}{1019:}{1046:}
FUNCTION TFMCHECK(M:SMALLNUMBER):SCALED;
BEGIN IF ABS(INTERNAL[M])>=134217728 THEN BEGIN BEGIN IF INTERACTION=3
THEN WAKEUPTERMIN;PRINTNL(133);PRINT(845);END;PRINT(INTNAME[M]);
PRINT(846);BEGIN HELPPTR:=1;HELPLINE[0]:=847;END;PUTGETERROR;
IF INTERNAL[M]>0 THEN TFMCHECK:=134217727 ELSE TFMCHECK:=-134217727;
END ELSE TFMCHECK:=INTERNAL[M];END;{:1046}PROCEDURE DOSHIPOUT;LABEL 10;
VAR C:INTEGER;BEGIN GETXNEXT;VARFLAG:=79;SCANEXPRESSI;
IF CURTYPE<>20 THEN IF CURTYPE=9 THEN CUREDGES:=CUREXP ELSE BEGIN{1007:}
BEGIN DISPERR(0,810);BEGIN HELPPTR:=4;HELPLINE[3]:=811;HELPLINE[2]:=812;
HELPLINE[1]:=813;HELPLINE[0]:=809;END;PUTGETFLUSHE(0);END{:1007};
GOTO 10;END ELSE BEGIN FINDEDGESVAR(CUREXP);CURTYPE:=1;END;
IF CUREDGES<>0 THEN BEGIN C:=ROUNDUNSCALE(INTERNAL[16])MOD 256;
IF C<0 THEN C:=C+256;{1047:}IF C<BC THEN BC:=C;IF C>EC THEN EC:=C;
CHAREXISTS[C]:=TRUE;GFWIDTH[C]:=ROUNDUNSCALE(INTERNAL[22]);
TFMWIDTH[C]:=TFMCHECK(18);TFMHEIGHT[C]:=TFMCHECK(19);
TFMDEPTH[C]:=TFMCHECK(20);TFMITALCORR[C]:=TFMCHECK(21){:1047};
IF INTERNAL[28]>=0 THEN SHIPOUT(C);END;FLUSHCUREXP(0);10:END;{:1019}
{1020:}PROCEDURE DODISPLAY;LABEL 45,50,10;VAR E:HALFWORD;BEGIN GETXNEXT;
VARFLAG:=71;SCANPRIMARY;IF CURTYPE<>20 THEN{1007:}BEGIN DISPERR(0,810);
BEGIN HELPPTR:=4;HELPLINE[3]:=811;HELPLINE[2]:=812;HELPLINE[1]:=813;
HELPLINE[0]:=809;END;PUTGETFLUSHE(0);END{:1007}ELSE BEGIN E:=CUREXP;
CURTYPE:=1;GETXNEXT;SCANEXPRESSI;IF CURTYPE<>15 THEN GOTO 50;
CUREXP:=ROUNDUNSCALE(CUREXP);IF CUREXP<0 THEN GOTO 45;
IF CUREXP>15 THEN GOTO 45;IF NOT WINDOWOPEN[CUREXP]THEN GOTO 45;
FINDEDGESVAR(E);IF CUREDGES<>0 THEN DISPEDGES(CUREXP);GOTO 10;
45:CUREXP:=CUREXP*65536;50:DISPERR(0,828);BEGIN HELPPTR:=1;
HELPLINE[0]:=829;END;PUTGETFLUSHE(0);FLUSHTOKENLI(E);END;10:END;{:1020}
{1021:}FUNCTION GETPAIR(C:COMMANDCODE):BOOLEAN;VAR P:HALFWORD;B:BOOLEAN;
BEGIN IF CURCMD<>C THEN GETPAIR:=FALSE ELSE BEGIN GETXNEXT;SCANEXPRESSI;
IF NICEPAIR(CUREXP,CURTYPE)THEN BEGIN P:=MEM[CUREXP+1].INT;
CURX:=MEM[P+1].INT;CURY:=MEM[P+3].INT;B:=TRUE;END ELSE B:=FALSE;
FLUSHCUREXP(0);GETPAIR:=B;END;END;{:1021}{1022:}PROCEDURE DOOPENWINDOW;
LABEL 45,10;VAR K:INTEGER;R0,C0,R1,C1:SCALED;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN GOTO 45;K:=ROUNDUNSCALE(CUREXP);
IF K<0 THEN GOTO 45;IF K>15 THEN GOTO 45;IF NOT GETPAIR(68)THEN GOTO 45;
R0:=CURX;C0:=CURY;IF NOT GETPAIR(69)THEN GOTO 45;R1:=CURX;C1:=CURY;
IF NOT GETPAIR(70)THEN GOTO 45;OPENAWINDOW(K,R0,C0,R1,C1,CURX,CURY);
GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(830);END;BEGIN HELPPTR:=2;HELPLINE[1]:=831;HELPLINE[0]:=832;END;
PUTGETERROR;10:END;{:1022}{1023:}PROCEDURE DOCULL;LABEL 45,10;
VAR E:HALFWORD;BEGIN GETXNEXT;VARFLAG:=72;SCANPRIMARY;
IF CURTYPE<>20 THEN{1007:}BEGIN DISPERR(0,810);BEGIN HELPPTR:=4;
HELPLINE[3]:=811;HELPLINE[2]:=812;HELPLINE[1]:=813;HELPLINE[0]:=809;END;
PUTGETFLUSHE(0);END{:1007}ELSE BEGIN E:=CUREXP;CURTYPE:=1;
IF NOT GETPAIR(72)THEN GOTO 45;IF(CURX>=0)OR(CURY<=0)THEN GOTO 45;
FINDEDGESVAR(E);
IF CUREDGES<>0 THEN CULLEDGES(FLOORUNSCALE(CURY+65535),FLOORUNSCALE(CURX
));GOTO 10;45:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(833);END;BEGIN HELPPTR:=1;HELPLINE[0]:=834;END;PUTGETERROR;
FLUSHTOKENLI(E);END;10:END;{:1023}{1030:}PROCEDURE DOMESSAGE;VAR M:0..2;
BEGIN M:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>4 THEN BEGIN DISPERR(0,838);BEGIN HELPPTR:=1;
HELPLINE[0]:=839;END;PUTGETERROR;END ELSE CASE M OF 0:PRINTNL(CUREXP);
1:{1034:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(CUREXP);END;
IF ERRHELP<>0 THEN USEERRHELP:=TRUE ELSE IF LONGHELPSEEN THEN BEGIN
HELPPTR:=1;HELPLINE[0]:=840;
END ELSE BEGIN IF INTERACTION<3 THEN LONGHELPSEEN:=TRUE;
BEGIN HELPPTR:=4;HELPLINE[3]:=841;HELPLINE[2]:=842;HELPLINE[1]:=843;
HELPLINE[0]:=844;END;END;PUTGETERROR;USEERRHELP:=FALSE;END{:1034};
2:{1031:}
BEGIN IF ERRHELP<>0 THEN BEGIN IF STRREF[ERRHELP]<127 THEN IF STRREF[
ERRHELP]>1 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]-1 ELSE FLUSHSTRING(
ERRHELP);END;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=0 THEN ERRHELP:=0 ELSE BEGIN
ERRHELP:=CUREXP;
BEGIN IF STRREF[ERRHELP]<127 THEN STRREF[ERRHELP]:=STRREF[ERRHELP]+1;
END;END;END{:1031};END;FLUSHCUREXP(0);END;{:1030}{1051:}
FUNCTION GETCODE:EIGHTBITS;LABEL 40;VAR C:INTEGER;BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE=15 THEN BEGIN C:=ROUNDUNSCALE(CUREXP);
IF C>=0 THEN IF C<256 THEN GOTO 40;
END ELSE IF CURTYPE=4 THEN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])=1
THEN BEGIN C:=STRPOOL[STRSTART[CUREXP]];GOTO 40;END;DISPERR(0,853);
BEGIN HELPPTR:=2;HELPLINE[1]:=854;HELPLINE[0]:=855;END;PUTGETFLUSHE(0);
C:=0;40:GETCODE:=C;END;{:1051}{1052:}PROCEDURE SETTAG(C:EIGHTBITS;
T:SMALLNUMBER;R:EIGHTBITS);
BEGIN IF CHARTAG[C]=0 THEN BEGIN CHARTAG[C]:=T;CHARREMAINDE[C]:=R;
END ELSE{1053:}BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(856);END;
IF(C>32)AND(C<128)THEN PRINT(C)ELSE BEGIN PRINT(857);PRINTINT(C);END;
PRINT(858);CASE CHARTAG[C]OF 1:PRINT(859);2:PRINT(860);3:PRINT(850);END;
BEGIN HELPPTR:=4;HELPLINE[3]:=861;HELPLINE[2]:=862;HELPLINE[1]:=863;
HELPLINE[0]:=864;END;PUTGETERROR;END{:1053};END;{:1052}{1054:}
PROCEDURE DOTFMCOMMAND;LABEL 22;VAR C,CC:EIGHTBITS;K:0..256;J:INTEGER;
BEGIN CASE CURMOD OF 0:{1055:}BEGIN C:=GETCODE;
WHILE CURCMD=78 DO BEGIN CC:=GETCODE;SETTAG(C,2,CC);C:=CC;END;END{:1055}
;1:{1056:}BEGIN 22:C:=GETCODE;IF CURCMD=77 THEN{1059:}
BEGIN IF NL>255 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(874);END;BEGIN HELPPTR:=1;HELPLINE[0]:=875;END;ERROR;
END ELSE SETTAG(C,1,NL);GOTO 22;END{:1059};
IF CURCMD=75 THEN BEGIN{1060:}LIGKERN[NL].B1:=C;LIGKERN[NL].B2:=CURMOD;
IF CURMOD=0 THEN LIGKERN[NL].B3:=GETCODE ELSE BEGIN GETXNEXT;
SCANEXPRESSI;IF CURTYPE<>15 THEN BEGIN DISPERR(0,876);BEGIN HELPPTR:=2;
HELPLINE[1]:=877;HELPLINE[0]:=180;END;PUTGETFLUSHE(0);END;
KERN[NK]:=CUREXP;K:=0;WHILE KERN[K]<>CUREXP DO K:=K+1;
IF K=NK THEN BEGIN IF NK=256 THEN OVERFLOW(873,256);NK:=NK+1;END;
LIGKERN[NL].B3:=K;END{:1060};
IF NL=LIGTABLESIZE THEN OVERFLOW(869,LIGTABLESIZE);NL:=NL+1;
IF CURCMD=78 THEN GOTO 22;
END ELSE BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);
PRINT(870);END;BEGIN HELPPTR:=1;HELPLINE[0]:=871;END;BACKERROR;END;
IF NL>0 THEN LIGKERN[NL-1].B0:=128;END{:1056};2:{1061:}
BEGIN IF NE=256 THEN OVERFLOW(850,256);C:=GETCODE;SETTAG(C,3,NE);
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=878;END;BACKERROR;END;EXTEN[NE].B0:=GETCODE;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=878;END;BACKERROR;END;EXTEN[NE].B1:=GETCODE;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=878;END;BACKERROR;END;EXTEN[NE].B2:=GETCODE;
IF CURCMD<>78 THEN BEGIN MISSINGERR(44);BEGIN HELPPTR:=1;
HELPLINE[0]:=878;END;BACKERROR;END;EXTEN[NE].B3:=GETCODE;NE:=NE+1;
END{:1061};3,4:BEGIN C:=CURMOD;GETXNEXT;SCANEXPRESSI;
IF(CURTYPE<>15)OR(CUREXP<32768)THEN BEGIN DISPERR(0,865);
BEGIN HELPPTR:=2;HELPLINE[1]:=866;HELPLINE[0]:=867;END;PUTGETERROR;
END ELSE BEGIN J:=ROUNDUNSCALE(CUREXP);
IF CURCMD<>77 THEN BEGIN MISSINGERR(58);BEGIN HELPPTR:=1;
HELPLINE[0]:=868;END;BACKERROR;END;IF C=3 THEN{1062:}
REPEAT IF J>HEADERSIZE THEN OVERFLOW(851,HEADERSIZE);
HEADERBYTE[J]:=GETCODE;J:=J+1;UNTIL CURCMD<>78{:1062}ELSE{1063:}
REPEAT IF J>MAXFONTDIMEN THEN OVERFLOW(852,MAXFONTDIMEN);
WHILE J>NP DO BEGIN NP:=NP+1;PARAM[NP]:=0;END;GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BEGIN DISPERR(0,879);BEGIN HELPPTR:=1;
HELPLINE[0]:=180;END;PUTGETFLUSHE(0);END;PARAM[J]:=CUREXP;J:=J+1;
UNTIL CURCMD<>78{:1063};END;END;END;END;{:1054}{1118:}
PROCEDURE DOSPECIAL;VAR M:SMALLNUMBER;BEGIN M:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF INTERNAL[28]>=0 THEN IF CURTYPE<>M THEN{1119:}
BEGIN DISPERR(0,894);BEGIN HELPPTR:=1;HELPLINE[0]:=895;END;PUTGETERROR;
END{:1119}ELSE BEGIN IF OUTPUTFILENA=0 THEN INITGF;IF M=4 THEN{1121:}
BEGIN IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=255 THEN BEGIN BEGIN
GFBUF[GFPTR]:=241;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP]);
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP]));END;GFSTRING(CUREXP);
END{:1121}ELSE{1120:}BEGIN BEGIN GFBUF[GFPTR]:=245;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(CUREXP);END{:1120};END;
FLUSHCUREXP(0);END;{:1118}{1129:}PROCEDURE STOREBASEFIL;VAR K:INTEGER;
P,Q:HALFWORD;X:INTEGER;W:FOURQUARTERS;BEGIN{1143:}SELECTOR:=5;
PRINT(906);PRINT(JOBNAME);PRINTCHAR(32);
PRINTINT(ROUNDUNSCALE(INTERNAL[12])MOD 100);PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[13]));PRINTCHAR(46);
PRINTINT(ROUNDUNSCALE(INTERNAL[14]));PRINTCHAR(41);
IF INTERACTION=0 THEN SELECTOR:=2 ELSE SELECTOR:=3;
BEGIN IF POOLPTR+1>MAXPOOLPTR THEN BEGIN IF POOLPTR+1>POOLSIZE THEN
OVERFLOW(129,POOLSIZE-INITPOOLPTR);MAXPOOLPTR:=POOLPTR+1;END;END;
BASEIDENT:=MAKESTRING;STRREF[BASEIDENT]:=127;PACKJOBNAME(907);
WHILE NOT WOPENOUT(BASEFILE)DO PROMPTFILENA(908,907);PRINTNL(909);
PRINT(WMAKENAMESTR(BASEFILE));FLUSHSTRING(STRPTR-1);
PRINTNL(BASEIDENT){:1143};{1133:}BEGIN BASEFILE↑.INT:=459621839;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=26000;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=2100;PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=1777;
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=6;PUT(BASEFILE);END{:1133};
{1135:}BEGIN BASEFILE↑.INT:=POOLPTR;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=STRPTR;PUT(BASEFILE);END;
FOR K:=0 TO STRPTR DO BEGIN BASEFILE↑.INT:=STRSTART[K];PUT(BASEFILE);
END;K:=0;WHILE K+4<POOLPTR DO BEGIN W.B0:=STRPOOL[K];W.B1:=STRPOOL[K+1];
W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];BEGIN BASEFILE↑.QQQQ:=W;
PUT(BASEFILE);END;K:=K+4;END;K:=POOLPTR-4;W.B0:=STRPOOL[K];
W.B1:=STRPOOL[K+1];W.B2:=STRPOOL[K+2];W.B3:=STRPOOL[K+3];
BEGIN BASEFILE↑.QQQQ:=W;PUT(BASEFILE);END;PRINTLN;PRINTINT(STRPTR);
PRINT(903);PRINTINT(POOLPTR){:1135};{1137:}SORTAVAIL;VARUSED:=0;
BEGIN BASEFILE↑.INT:=ROVER;PUT(BASEFILE);END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+Q+2-P;VARUSED:=VARUSED+Q-P;P:=Q+MEM[Q].HH.LH;Q:=MEM[Q+1].HH.RH;
UNTIL Q=ROVER;VARUSED:=VARUSED+26000-P;DYNUSED:=MEMEND-25999;
BEGIN BASEFILE↑.INT:=MEMEND;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=AVAIL;PUT(BASEFILE);END;
FOR K:=P TO MEMEND DO BEGIN BASEFILE↑:=MEM[K];PUT(BASEFILE);END;
X:=X+MEMEND+1-P;P:=AVAIL;WHILE P<>0 DO BEGIN DYNUSED:=DYNUSED-1;
P:=MEM[P].HH.RH;END;BEGIN BASEFILE↑.INT:=VARUSED;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=DYNUSED;PUT(BASEFILE);END;PRINTLN;PRINTINT(X);
PRINT(904);PRINTINT(VARUSED);PRINTCHAR(38);PRINTINT(DYNUSED){:1137};
{1139:}BEGIN BASEFILE↑.INT:=HASHUSED;PUT(BASEFILE);END;
STCOUNT:=2228-HASHUSED;
FOR P:=1 TO HASHUSED DO IF HASH[P].RH<>0 THEN BEGIN BEGIN BASEFILE↑.INT
:=P;PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=HASH[P];PUT(BASEFILE);END;
BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;STCOUNT:=STCOUNT+1;END;
FOR P:=HASHUSED+1 TO 2243 DO BEGIN BEGIN BASEFILE↑.HH:=HASH[P];
PUT(BASEFILE);END;BEGIN BASEFILE↑.HH:=EQTB[P];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STCOUNT;PUT(BASEFILE);END;PRINTLN;
PRINTINT(STCOUNT);PRINT(905){:1139};{1141:}BEGIN BASEFILE↑.INT:=INTPTR;
PUT(BASEFILE);END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN BASEFILE↑.INT:=INTERNAL[K];
PUT(BASEFILE);END;BEGIN BASEFILE↑.INT:=INTNAME[K];PUT(BASEFILE);END;END;
BEGIN BASEFILE↑.INT:=STARTSYM;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=INTERACTION;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=BASEIDENT;PUT(BASEFILE);END;
BEGIN BASEFILE↑.INT:=69069;PUT(BASEFILE);END;INTERNAL[10]:=0{:1141};
{1144:}WCLOSE(BASEFILE){:1144};END;{:1129}PROCEDURE DOSTATEMENT;
BEGIN CURTYPE:=1;GETXNEXT;IF CURCMD>42 THEN{942:}
BEGIN IF CURCMD<79 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(716);END;PRINTCMDMOD(CURCMD,CURMOD);PRINTCHAR(39);
BEGIN HELPPTR:=5;HELPLINE[4]:=717;HELPLINE[3]:=718;HELPLINE[2]:=719;
HELPLINE[1]:=720;HELPLINE[0]:=721;END;BACKERROR;GETNEXT;END;END{:942}
ELSE IF CURCMD>29 THEN{945:}BEGIN VARFLAG:=76;SCANEXPRESSI;
IF CURCMD<80 THEN BEGIN IF CURCMD=50 THEN DOEQUATION ELSE IF CURCMD=76
THEN DOASSIGNMENT ELSE IF CURTYPE=4 THEN{946:}
BEGIN IF INTERNAL[1]>0 THEN BEGIN PRINTNL(CUREXP);BREAK(TTY);END;
IF INTERNAL[28]>0 THEN{1122:}BEGIN IF OUTPUTFILENA=0 THEN INITGF;
IF(STRSTART[CUREXP+1]-STRSTART[CUREXP])<=249 THEN BEGIN BEGIN GFBUF[
GFPTR]:=241;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
BEGIN GFBUF[GFPTR]:=(STRSTART[CUREXP+1]-STRSTART[CUREXP])+6;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
END ELSE BEGIN BEGIN GFBUF[GFPTR]:=243;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFTHREE((STRSTART[CUREXP+1]-STRSTART[CUREXP])+6);END;GFSTRING(896);
GFSTRING(CUREXP);END{:1122};END{:946}
ELSE IF CURTYPE<>1 THEN BEGIN DISPERR(0,726);BEGIN HELPPTR:=3;
HELPLINE[2]:=727;HELPLINE[1]:=728;HELPLINE[0]:=729;END;PUTGETERROR;END;
FLUSHCUREXP(0);CURTYPE:=1;END;END{:945}ELSE{944:}
BEGIN IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
CASE CURCMD OF 29:DOTYPEDECLAR;
14:IF CURMOD>2 THEN MAKEOPDEF ELSE IF CURMOD>0 THEN SCANDEF;15:READTOKS;
{972:}23:DORANDOMSEED;{:972}{974:}22:BEGIN PRINTLN;INTERACTION:=CURMOD;
{69:}IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:69};
IF JOBNAME<>0 THEN SELECTOR:=SELECTOR+2;GETNEXT;END;{:974}{977:}
20:DOPROTECTION;{:977}{981:}26:DEFDELIMS;{:981}{984:}
10:REPEAT GETSYMBOL;SAVEVARIABLE(CURSYM);GETNEXT;UNTIL CURCMD<>78;
11:DOINTERIM;12:DOLET;13:DONEWINTERNA;{:984}{990:}
21:BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
CASE CURMOD OF 0:DOSHOWTOKEN;1:DOSHOWSTATS;2,3:DOSHOW;4:DOSHOWVAR;
5,6:DOSHOWDEPEND(CURMOD);END;BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(784);END;IF INTERACTION<3 THEN BEGIN HELPPTR:=0;
ERRORCOUNT:=ERRORCOUNT-1;END ELSE BEGIN HELPPTR:=1;HELPLINE[0]:=785;END;
IF CURCMD=79 THEN ERROR ELSE PUTGETERROR;END;{:990}{1005:}17:DOADDTO;
{:1005}{1018:}16:DOSHIPOUT;9:DODISPLAY;27:DOOPENWINDOW;18:DOCULL;{:1018}
{1024:}25:BEGIN GETSYMBOL;STARTSYM:=CURSYM;GETNEXT;END;{:1024}{1029:}
24:DOMESSAGE;{:1029}{1048:}19:DOTFMCOMMAND;{:1048}{1116:}28:DOSPECIAL;
{:1116}END;CURTYPE:=1;END{:944};IF CURCMD<79 THEN{943:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(722);
END;BEGIN HELPPTR:=6;HELPLINE[5]:=723;HELPLINE[4]:=724;HELPLINE[3]:=725;
HELPLINE[2]:=719;HELPLINE[1]:=720;HELPLINE[0]:=721;END;BACKERROR;
SCANNERSTATU:=2;REPEAT GETNEXT;{697:}
IF CURCMD=41 THEN BEGIN IF STRREF[CURMOD]<127 THEN IF STRREF[CURMOD]>1
THEN STRREF[CURMOD]:=STRREF[CURMOD]-1 ELSE FLUSHSTRING(CURMOD);END{:697}
;UNTIL CURCMD>=79;SCANNERSTATU:=0;END{:943};ERRORCOUNT:=0;END;{:941}
{969:}PROCEDURE MAINCONTROL;BEGIN REPEAT DOSTATEMENT;
IF CURCMD=80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(754);END;BEGIN HELPPTR:=2;HELPLINE[1]:=755;
HELPLINE[0]:=533;END;FLUSHERROR(0);END;UNTIL CURCMD=81;END;{:969}{1065:}
FUNCTION SORTIN(V:SCALED):HALFWORD;LABEL 40;VAR P,Q,R:HALFWORD;
BEGIN P:=26001;WHILE TRUE DO BEGIN Q:=MEM[P].HH.RH;
IF V<=MEM[Q+1].INT THEN GOTO 40;P:=Q;END;
40:IF V<MEM[Q+1].INT THEN BEGIN R:=GETNODE(2);MEM[R+1].INT:=V;
MEM[R].HH.RH:=Q;MEM[P].HH.RH:=R;END;SORTIN:=MEM[P].HH.RH;END;{:1065}
{1066:}FUNCTION MINCOVER(D:SCALED):INTEGER;VAR P:HALFWORD;L:SCALED;
M:INTEGER;BEGIN M:=0;P:=MEM[26001].HH.RH;PERTURBATION:=2147483647;
WHILE P<>23 DO BEGIN M:=M+1;L:=MEM[P+1].INT;REPEAT P:=MEM[P].HH.RH;
UNTIL MEM[P+1].INT>L+D;
IF MEM[P+1].INT-L<PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-L;END;
MINCOVER:=M;END;{:1066}{1068:}FUNCTION THRESHOLD(M:INTEGER):SCALED;
VAR D:SCALED;
BEGIN IF MINCOVER(0)<=M THEN THRESHOLD:=0 ELSE BEGIN REPEAT D:=
PERTURBATION;UNTIL MINCOVER(D+D)<=M;
WHILE MINCOVER(D)>M DO D:=PERTURBATION;THRESHOLD:=D;END;END;{:1068}
{1069:}FUNCTION SKIMP(M:INTEGER):INTEGER;VAR D:SCALED;P,Q,R:HALFWORD;
L:SCALED;V:SCALED;BEGIN D:=THRESHOLD(M);PERTURBATION:=0;Q:=26001;M:=0;
P:=MEM[26001].HH.RH;WHILE P<>23 DO BEGIN M:=M+1;L:=MEM[P+1].INT;
MEM[P].HH.LH:=M;IF MEM[MEM[P].HH.RH+1].INT<=L+D THEN{1070:}
BEGIN REPEAT P:=MEM[P].HH.RH;MEM[P].HH.LH:=M;
UNTIL MEM[MEM[P].HH.RH+1].INT>L+D;V:=(L+MEM[P+1].INT)DIV 2;
IF MEM[P+1].INT-V>PERTURBATION THEN PERTURBATION:=MEM[P+1].INT-V;R:=Q;
REPEAT R:=MEM[R].HH.RH;MEM[R+1].INT:=V;UNTIL R=P;MEM[Q].HH.RH:=P;
END{:1070};Q:=P;P:=MEM[P].HH.RH;END;SKIMP:=M;END;{:1069}{1071:}
PROCEDURE TFMWARNING(M:SMALLNUMBER);BEGIN PRINTNL(880);
PRINT(INTNAME[M]);PRINT(881);PRINTSCALED(PERTURBATION);PRINT(882);END;
{:1071}{1076:}PROCEDURE FIXCHECKSUM;VAR K:EIGHTBITS;
B1,B2,B3,B4:EIGHTBITS;X:INTEGER;
BEGIN IF HEADERBYTE[1]<0 THEN IF HEADERBYTE[2]<0 THEN IF HEADERBYTE[3]<0
THEN IF HEADERBYTE[4]<0 THEN BEGIN{1078:}B1:=0;B2:=0;B3:=BC;B4:=EC;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN BEGIN X:=((MEM[TFMWIDTH[K]+1].
INT+8)DIV 16)+K*4194304;IF X<0 THEN X:=X+1073741823;
B1:=(B1+B1+X)MOD 256;B2:=(B2+B2+(X MOD 255))MOD 256;
B3:=(B3+B3+(X MOD 253))MOD 256;B4:=(B4+B4+(X MOD 251))MOD 256;END;
{:1078};HEADERBYTE[1]:=B1;HEADERBYTE[2]:=B2;HEADERBYTE[3]:=B3;
HEADERBYTE[4]:=B4;END;
FOR K:=1 TO 4 DO IF HEADERBYTE[K]<0 THEN HEADERBYTE[K]:=0;END;{:1076}
{1077:}PROCEDURE FIXDESIGNSIZ;VAR D:SCALED;BEGIN D:=INTERNAL[23];
IF(D<65536)OR(D>=134217728)THEN BEGIN IF D<>0 THEN PRINTNL(883);
D:=8388608;INTERNAL[23]:=D;END;
IF HEADERBYTE[5]<0 THEN IF HEADERBYTE[6]<0 THEN IF HEADERBYTE[7]<0 THEN
IF HEADERBYTE[8]<0 THEN BEGIN HEADERBYTE[5]:=D DIV 1048576;
HEADERBYTE[6]:=(D DIV 4096)MOD 256;HEADERBYTE[7]:=(D DIV 16)MOD 256;
HEADERBYTE[8]:=(D MOD 16)*16;END;
MAXTFMDIMEN:=16*INTERNAL[23]-INTERNAL[23]DIV 2097152;
IF MAXTFMDIMEN>=134217728 THEN MAXTFMDIMEN:=134217727;END;{:1077}{1079:}
PROCEDURE TFMTWO(X:INTEGER);BEGIN WRITE(TFMFILE,X DIV 256);
WRITE(TFMFILE,X MOD 256);END;PROCEDURE TFMFOUR(X:INTEGER);
BEGIN IF X>=0 THEN WRITE(TFMFILE,X DIV 16777216)ELSE BEGIN X:=X
+1073741824;X:=X+1073741824;WRITE(TFMFILE,(X DIV 16777216)+128);END;
X:=X MOD 16777216;WRITE(TFMFILE,X DIV 65536);X:=X MOD 65536;
WRITE(TFMFILE,X DIV 256);WRITE(TFMFILE,X MOD 256);END;
PROCEDURE TFMQQQQ(X:FOURQUARTERS);BEGIN WRITE(TFMFILE,X.B0);
WRITE(TFMFILE,X.B1);WRITE(TFMFILE,X.B2);WRITE(TFMFILE,X.B3);END;{:1079}
{1083:}PROCEDURE TFMDIMENOUT(X:SCALED);
BEGIN IF ABS(X)>MAXTFMDIMEN THEN BEGIN TFMCHANGED:=TFMCHANGED+1;
IF X>0 THEN X:=16777215 ELSE X:=-16777215;
END ELSE X:=MAKESCALED(X*16,INTERNAL[23]);TFMFOUR(X);END;{:1083}{1130:}
{732:}FUNCTION OPENBASEFILE:BOOLEAN;LABEL 40,10;VAR J:0..BUFSIZE;
BEGIN IF BUFFER[CURINPUT.LOCFIELD]=38 THEN BEGIN CURINPUT.LOCFIELD:=
CURINPUT.LOCFIELD+1;J:=CURINPUT.LOCFIELD;BUFFER[LAST]:=32;
WHILE BUFFER[J]<>32 DO J:=J+1;PACKBUFFERED(0,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN BEGIN CURINPUT.LOCFIELD:=J;GOTO 40;END;
PACKBUFFERED(9,CURINPUT.LOCFIELD,J-1);
IF WOPENIN(BASEFILE)THEN BEGIN CURINPUT.LOCFIELD:=J;GOTO 40;END;
WAKEUPTERMIN;
WRITELN(TTY,'Sorry, I can''t find that base;',' will try PLAIN.');END;
PACKBUFFERED(14,1,0);IF NOT WOPENIN(BASEFILE)THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'I can''t find the PLAIN base file!');OPENBASEFILE:=FALSE;
GOTO 10;END;40:OPENBASEFILE:=TRUE;10:END;{:732}
FUNCTION LOADBASEFILE:BOOLEAN;LABEL 6666,10;VAR K:INTEGER;P,Q:HALFWORD;
X:INTEGER;W:FOURQUARTERS;BEGIN{1134:}X:=BASEFILE↑.INT;
IF X<>459621839 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>26000 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>2100 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>1777 THEN GOTO 6666;BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<>6 THEN GOTO 6666{:1134};{1136:}BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<0 THEN GOTO 6666;
IF X>POOLSIZE THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','string pool size');GOTO 6666;
END ELSE POOLPTR:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF X<0 THEN GOTO 6666;IF X>MAXSTRINGS THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','max strings');GOTO 6666;
END ELSE STRPTR:=X;END;
FOR K:=0 TO STRPTR DO BEGIN BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;
END;IF(X<0)OR(X>POOLPTR)THEN GOTO 6666 ELSE STRSTART[K]:=X;END;
STRREF[K]:=127;END;K:=0;WHILE K+4<POOLPTR DO BEGIN BEGIN GET(BASEFILE);
W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;STRPOOL[K+1]:=W.B1;
STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3;K:=K+4;END;K:=POOLPTR-4;
BEGIN GET(BASEFILE);W:=BASEFILE↑.QQQQ;END;STRPOOL[K]:=W.B0;
STRPOOL[K+1]:=W.B1;STRPOOL[K+2]:=W.B2;STRPOOL[K+3]:=W.B3{:1136};{1138:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>26000)THEN GOTO 6666 ELSE ROVER:=X;END;P:=0;Q:=ROVER;X:=0;
REPEAT FOR K:=P TO Q+1 DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
P:=Q+MEM[Q].HH.LH;
IF(P>26000)OR((Q>=MEM[Q+1].HH.RH)AND(MEM[Q+1].HH.RH<>ROVER))THEN GOTO
6666;Q:=MEM[Q+1].HH.RH;UNTIL Q=ROVER;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;IF X<26000 THEN GOTO 6666;
IF X>MEMMAX THEN BEGIN WAKEUPTERMIN;
WRITELN(TTY,'---! Must increase the ','mem max');GOTO 6666;
END ELSE MEMEND:=X;END;BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>MEMEND)THEN GOTO 6666 ELSE AVAIL:=X;END;
FOR K:=P TO MEMEND DO BEGIN GET(BASEFILE);MEM[K]:=BASEFILE↑;END;
BEGIN GET(BASEFILE);VARUSED:=BASEFILE↑.INT;END;BEGIN GET(BASEFILE);
DYNUSED:=BASEFILE↑.INT;END;MAXVARUSED:=VARUSED{:1138};{1140:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<1)OR(X>2229)THEN GOTO 6666 ELSE HASHUSED:=X;END;P:=0;
REPEAT BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<P+1)OR(X>HASHUSED)THEN GOTO 6666 ELSE P:=X;END;BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
UNTIL P=HASHUSED;FOR P:=HASHUSED+1 TO 2243 DO BEGIN BEGIN GET(BASEFILE);
HASH[P]:=BASEFILE↑.HH;END;BEGIN GET(BASEFILE);EQTB[P]:=BASEFILE↑.HH;END;
END;BEGIN GET(BASEFILE);STCOUNT:=BASEFILE↑.INT;END{:1140};{1142:}
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<31)OR(X>MAXINTERNAL)THEN GOTO 6666 ELSE INTPTR:=X;END;
FOR K:=1 TO INTPTR DO BEGIN BEGIN GET(BASEFILE);
INTERNAL[K]:=BASEFILE↑.INT;END;BEGIN BEGIN GET(BASEFILE);
X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE INTNAME[K]:=X;END;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>2229)THEN GOTO 6666 ELSE STARTSYM:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>3)THEN GOTO 6666 ELSE INTERACTION:=X;END;
BEGIN BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<0)OR(X>STRPTR)THEN GOTO 6666 ELSE BASEIDENT:=X;END;
BEGIN GET(BASEFILE);X:=BASEFILE↑.INT;END;
IF(X<>69069)OR EOF(BASEFILE)THEN GOTO 6666{:1142};LOADBASEFILE:=TRUE;
GOTO 10;6666:WAKEUPTERMIN;
WRITELN(TTY,'(Fatal base file error; I''m stymied)');
LOADBASEFILE:=FALSE;10:END;{:1130}{1145:}{775:}PROCEDURE SCANPRIMARY;
LABEL 20,30,31,10;VAR P,Q:HALFWORD;C:QUARTERWORD;MYVARFLAG:0..81;
LDELIM,RDELIM:HALFWORD;{783:}GROUPLINE:INTEGER;{:783}{788:}
NUM,DENOM:SCALED;{:788}{795:}PREHEAD,POSTHEAD,TAIL:HALFWORD;
TT:SMALLNUMBER;T:HALFWORD;MACROREF:HALFWORD;{:795}
BEGIN MYVARFLAG:=VARFLAG;VARFLAG:=0;20:IF ARITHERROR THEN CLEARARITH;
{777:}IF PANICKING THEN CHECKMEM(FALSE);
IF INTERRUPT<>0 THEN IF OKTOINTERRUP THEN BEGIN BACKINPUT;
BEGIN IF INTERRUPT<>0 THEN PAUSEFORINST;END;GETXNEXT;END{:777};
CASE CURCMD OF 30:{778:}BEGIN LDELIM:=CURSYM;RDELIM:=CURMOD;GETXNEXT;
SCANEXPRESSI;IF(CURCMD=78)AND(CURTYPE>=15)THEN{782:}BEGIN P:=GETNODE(2);
MEM[P].HH.B0:=14;MEM[P].HH.B1:=11;INITBIGNODE(P);Q:=MEM[P+1].INT;
STASHIN(Q);GETXNEXT;SCANEXPRESSI;
IF CURTYPE<15 THEN BEGIN DISPERR(0,622);BEGIN HELPPTR:=4;
HELPLINE[3]:=623;HELPLINE[2]:=624;HELPLINE[1]:=625;HELPLINE[0]:=626;END;
PUTGETFLUSHE(0);END;STASHIN(Q+2);CHECKDELIMIT(LDELIM,RDELIM);
CURTYPE:=14;CUREXP:=P;END{:782}ELSE CHECKDELIMIT(LDELIM,RDELIM);
END{:778};31:{784:}BEGIN GROUPLINE:=LINE;
IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);BEGIN P:=GETAVAIL;
MEM[P].HH.LH:=0;MEM[P].HH.RH:=SAVEPTR;SAVEPTR:=P;END;REPEAT DOSTATEMENT;
UNTIL CURCMD<>79;
IF CURCMD<>80 THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(627);END;PRINTINT(GROUPLINE);PRINT(628);
BEGIN HELPPTR:=2;HELPLINE[1]:=629;HELPLINE[0]:=630;END;BACKERROR;
CURCMD:=80;END;UNSAVE;IF INTERNAL[6]>0 THEN SHOWCMDMOD(CURCMD,CURMOD);
END{:784};41:{785:}BEGIN CURTYPE:=4;CUREXP:=CURMOD;END{:785};40:{789:}
BEGIN CUREXP:=CURMOD;CURTYPE:=15;GETXNEXT;
IF CURCMD<>54 THEN DENOM:=0 ELSE BEGIN GETXNEXT;
IF CURCMD<>40 THEN BEGIN BACKINPUT;CURCMD:=54;CURMOD:=70;CURSYM:=2233;
GOTO 10;END;NUM:=CUREXP;DENOM:=CURMOD;IF DENOM=0 THEN{790:}
BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;PRINTNL(133);PRINT(631);
END;BEGIN HELPPTR:=1;HELPLINE[0]:=632;END;ERROR;END{:790}
ELSE CUREXP:=MAKESCALED(NUM,DENOM);GETXNEXT;END;
IF CURCMD>=29 THEN IF CURCMD<40 THEN BEGIN P:=STASHCUREXP;SCANPRIMARY;
IF(ABS(NUM)>=ABS(DENOM))OR(CURTYPE<14)THEN DOBINARY(P,69)ELSE BEGIN
FRACMULT(NUM,DENOM);FREENODE(P,2);END;END;GOTO 10;END{:789};32:{786:}
DONULLARY(CURMOD){:786};33,29,35,42:{787:}BEGIN C:=CURMOD;GETXNEXT;
SCANPRIMARY;DOUNARY(C);GOTO 10;END{:787};36:{791:}BEGIN C:=CURMOD;
GETXNEXT;SCANEXPRESSI;IF CURCMD<>67 THEN BEGIN MISSINGERR(339);
PRINT(561);PRINTCMDMOD(36,C);BEGIN HELPPTR:=1;HELPLINE[0]:=562;END;
BACKERROR;END;P:=STASHCUREXP;GETXNEXT;SCANPRIMARY;DOBINARY(P,C);GOTO 10;
END{:791};34:{792:}BEGIN GETXNEXT;SCANSUFFIX;OLDSETTING:=SELECTOR;
SELECTOR:=5;SHOWTOKENLIS(CUREXP,0,10000);FLUSHTOKENLI(CUREXP);
CUREXP:=MAKESTRING;SELECTOR:=OLDSETTING;CURTYPE:=4;GOTO 10;END{:792};
38:{793:}BEGIN Q:=CURMOD;IF MYVARFLAG=76 THEN BEGIN GETXNEXT;
IF CURCMD=76 THEN BEGIN CUREXP:=GETAVAIL;MEM[CUREXP].HH.LH:=Q+2243;
CURTYPE:=20;GOTO 10;END;BACKINPUT;END;CURTYPE:=15;CUREXP:=INTERNAL[Q];
END{:793};37:MAKEEXPCOPY(CURMOD);39:{796:}BEGIN PREHEAD:=GETAVAIL;
TAIL:=PREHEAD;POSTHEAD:=0;TT:=1;WHILE TRUE DO BEGIN T:=CURTOK;
MEM[TAIL].HH.RH:=T;IF TT<>0 THEN BEGIN{803:}BEGIN P:=MEM[PREHEAD].HH.RH;
Q:=MEM[P].HH.LH;TT:=0;IF EQTB[Q].LH MOD 82=39 THEN BEGIN Q:=EQTB[Q].RH;
WHILE TRUE DO BEGIN P:=MEM[P].HH.RH;IF P=0 THEN BEGIN TT:=MEM[Q].HH.B0;
GOTO 31;END;IF MEM[Q].HH.B0<>21 THEN GOTO 31;
Q:=MEM[MEM[Q+1].HH.LH].HH.RH;
IF P>26000 THEN BEGIN REPEAT Q:=MEM[Q].HH.RH;
UNTIL MEM[Q+2].HH.LH>=MEM[P].HH.LH;
IF MEM[Q+2].HH.LH>MEM[P].HH.LH THEN GOTO 31;END;END;END;31:END{:803};
IF TT>=22 THEN{797:}BEGIN MEM[TAIL].HH.RH:=0;
IF TT>22 THEN BEGIN POSTHEAD:=GETAVAIL;TAIL:=POSTHEAD;
MEM[TAIL].HH.RH:=T;TT:=0;MACROREF:=MEM[Q+1].INT;
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH+1;END ELSE{806:}
BEGIN P:=GETAVAIL;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=P;MEM[P].HH.LH:=T;MACROCALL(MEM[Q+1].INT,PREHEAD,0);
GETXNEXT;GOTO 20;END{:806};END{:797};END;GETXNEXT;TAIL:=T;
IF CURCMD=52 THEN{798:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURCMD<>63 THEN{799:}BEGIN BACKINPUT;BACKEXPR;CURCMD:=52;CURMOD:=0;
CURSYM:=2232;END{:799}ELSE BEGIN IF CURTYPE<>15 THEN BADSUBSCRIPT;
CURCMD:=40;CURMOD:=CUREXP;CURSYM:=0;END;END{:798};
IF CURCMD<38 THEN GOTO 30;IF CURCMD>40 THEN GOTO 30;END;30:{805:}
IF POSTHEAD<>0 THEN{807:}BEGIN BACKINPUT;P:=GETAVAIL;
Q:=MEM[POSTHEAD].HH.RH;MEM[PREHEAD].HH.LH:=MEM[PREHEAD].HH.RH;
MEM[PREHEAD].HH.RH:=POSTHEAD;MEM[POSTHEAD].HH.LH:=Q;
MEM[POSTHEAD].HH.RH:=P;MEM[P].HH.LH:=MEM[Q].HH.RH;MEM[Q].HH.RH:=0;
MACROCALL(MACROREF,PREHEAD,0);
MEM[MACROREF].HH.LH:=MEM[MACROREF].HH.LH-1;GETXNEXT;GOTO 20;END{:807};
Q:=MEM[PREHEAD].HH.RH;BEGIN MEM[PREHEAD].HH.RH:=AVAIL;AVAIL:=PREHEAD;
DYNUSED:=DYNUSED-1;END;IF CURCMD=MYVARFLAG THEN BEGIN CURTYPE:=20;
CUREXP:=Q;GOTO 10;END;P:=FINDVARIABLE(Q);
IF P<>0 THEN MAKEEXPCOPY(P)ELSE BEGIN OBLITERATED(Q);HELPLINE[2]:=644;
HELPLINE[1]:=645;HELPLINE[0]:=646;PUTGETFLUSHE(0);END;FLUSHNODELIS(Q);
GOTO 10{:805};END{:796};OTHERS:BEGIN BADEXP(616);GOTO 20;END END;
GETXNEXT;10:END;{:775}{812:}PROCEDURE SCANSUFFIX;LABEL 30;
VAR H,T:HALFWORD;P:HALFWORD;BEGIN H:=GETAVAIL;T:=H;
WHILE TRUE DO BEGIN IF CURCMD=52 THEN{813:}BEGIN GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>15 THEN BADSUBSCRIPT;
IF CURCMD<>63 THEN BEGIN MISSINGERR(93);BEGIN HELPPTR:=3;
HELPLINE[2]:=648;HELPLINE[1]:=649;HELPLINE[0]:=541;END;BACKERROR;END;
CURCMD:=40;CURMOD:=CUREXP;END{:813};
IF CURCMD=40 THEN P:=NEWNUMTOK(CURMOD)ELSE IF(CURCMD=39)OR(CURCMD=38)
THEN BEGIN P:=GETAVAIL;MEM[P].HH.LH:=CURSYM;END ELSE GOTO 30;
MEM[T].HH.RH:=P;T:=P;GETXNEXT;END;30:CUREXP:=MEM[H].HH.RH;
BEGIN MEM[H].HH.RH:=AVAIL;AVAIL:=H;DYNUSED:=DYNUSED-1;END;CURTYPE:=20;
END;{:812}{814:}PROCEDURE SCANSECONDAR;LABEL 20,22,10;
VAR P,Q,R:HALFWORD;C,D:HALFWORD;MACNAME:HALFWORD;
BEGIN 20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(650);SCANPRIMARY;
22:IF CURCMD>=51 THEN IF CURCMD<=55 THEN BEGIN P:=STASHCUREXP;C:=CURMOD;
D:=CURCMD;IF D=53 THEN BEGIN MACNAME:=CURSYM;
MEM[C].HH.LH:=MEM[C].HH.LH+1;END;GETXNEXT;IF D=52 THEN{816:}
BEGIN SCANEXPRESSI;IF CURCMD<>78 THEN BEGIN{799:}BEGIN BACKINPUT;
BACKEXPR;CURCMD:=52;CURMOD:=0;CURSYM:=2232;END{:799};UNSTASHCUREX(P);
GOTO 10;END;Q:=STASHCUREXP;GETXNEXT;SCANEXPRESSI;
IF CURCMD<>63 THEN BEGIN MISSINGERR(93);BEGIN HELPPTR:=3;
HELPLINE[2]:=651;HELPLINE[1]:=649;HELPLINE[0]:=541;END;BACKERROR;END;
R:=STASHCUREXP;MAKEEXPCOPY(Q);DOBINARY(R,68);DOBINARY(P,69);
DOBINARY(Q,67);GETXNEXT;END{:816}ELSE BEGIN SCANPRIMARY;
IF D<>53 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
10:END;{:814}{817:}PROCEDURE SCANTERTIARY;LABEL 20,22;VAR P:HALFWORD;
C,D:HALFWORD;MACNAME:HALFWORD;
BEGIN 20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(652);SCANSECONDAR;
IF CURTYPE=8 THEN MATERIALIZEP;
22:IF CURCMD>=42 THEN IF CURCMD<=45 THEN IF(CURCMD<>45)OR(CURTYPE<11)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=43 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
GETXNEXT;SCANSECONDAR;IF D<>43 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;
BINARYMAC(P,C,MACNAME);MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;
END;GOTO 22;END;END;{:817}{821:}PROCEDURE SCANEXPRESSI;
LABEL 20,30,22,25,26,10;VAR P,Q,R,PP,QQ:HALFWORD;C,D:HALFWORD;
MYVARFLAG:0..81;MACNAME:HALFWORD;CYCLEHIT:BOOLEAN;GIVENLIST:HALFWORD;
X,Y:SCALED;T:0..4;BEGIN MYVARFLAG:=VARFLAG;
20:IF(CURCMD<29)OR(CURCMD>42)THEN BADEXP(655);SCANTERTIARY;
22:IF CURCMD>=45 THEN IF CURCMD<=50 THEN IF(CURCMD<>50)OR(MYVARFLAG<>76)
THEN BEGIN P:=STASHCUREXP;C:=CURMOD;D:=CURCMD;
IF D=48 THEN BEGIN MACNAME:=CURSYM;MEM[C].HH.LH:=MEM[C].HH.LH+1;END;
IF D<=47 THEN{822:}BEGIN CYCLEHIT:=FALSE;{823:}BEGIN GIVENLIST:=0;
IF MEM[P].HH.B0=14 THEN BEGIN UNSTASHCUREX(P);P:=NEWKNOT;
END ELSE IF MEM[P].HH.B0=11 THEN BEGIN Q:=P;P:=MEM[P+1].INT;
FREENODE(Q,2);END ELSE GOTO 10;Q:=P;
WHILE MEM[Q].HH.RH<>P DO Q:=MEM[Q].HH.RH;
IF MEM[P].HH.B0<>0 THEN BEGIN R:=COPYKNOT(P);MEM[Q].HH.RH:=R;Q:=R;END;
MEM[P].HH.B0:=4;MEM[Q].HH.B1:=4;END{:823};25:{827:}
IF CURCMD=46 THEN{832:}BEGIN T:=SCANDIRECTIO;
IF T<>4 THEN BEGIN MEM[Q].HH.B1:=T;MEM[Q+5].INT:=CUREXP;
IF T=2 THEN BEGIN MEM[CUREXP].HH.RH:=GIVENLIST;GIVENLIST:=CUREXP;END;
IF MEM[Q].HH.B0=4 THEN BEGIN MEM[Q].HH.B0:=T;
IF T=3 THEN MEM[Q+3].INT:=65536 ELSE MEM[Q+3].INT:=CUREXP;END;END;
END{:832};D:=CURCMD;IF D=47 THEN{834:}BEGIN GETXNEXT;
IF CURCMD=59 THEN{837:}IF CURMOD=0 THEN BEGIN MEM[Q+6].INT:=0;Y:=0;
GETXNEXT;END ELSE BEGIN GETXNEXT;SCANPRIMARY;{838:}
IF(CURTYPE<>15)OR(CUREXP<49152)THEN BEGIN DISPERR(0,673);
BEGIN HELPPTR:=1;HELPLINE[0]:=674;END;PUTGETFLUSHE(65536);END{:838};
MEM[Q+6].INT:=CUREXP;IF CURCMD=51 THEN BEGIN GETXNEXT;SCANPRIMARY;{838:}
IF(CURTYPE<>15)OR(CUREXP<49152)THEN BEGIN DISPERR(0,673);
BEGIN HELPPTR:=1;HELPLINE[0]:=674;END;PUTGETFLUSHE(65536);END{:838};END;
Y:=CUREXP;END{:837}ELSE IF CURCMD=58 THEN{839:}BEGIN MEM[Q].HH.B1:=1;
T:=1;GETXNEXT;SCANPRIMARY;KNOWNPAIR;MEM[Q+5].INT:=CURX;
MEM[Q+6].INT:=CURY;IF CURCMD<>51 THEN BEGIN X:=MEM[Q+5].INT;
Y:=MEM[Q+6].INT;END ELSE BEGIN GETXNEXT;SCANPRIMARY;KNOWNPAIR;X:=CURX;
Y:=CURY;END;END{:839}ELSE BEGIN MEM[Q+6].INT:=65536;Y:=65536;BACKINPUT;
GOTO 30;END;IF CURCMD<>47 THEN BEGIN MISSINGERR(280);BEGIN HELPPTR:=1;
HELPLINE[0]:=670;END;BACKERROR;END;30:END{:834}
ELSE IF D<>45 THEN GOTO 26;GETXNEXT;IF CURCMD=46 THEN{833:}
BEGIN T:=SCANDIRECTIO;
IF MEM[Q].HH.B1=1 THEN BEGIN IF T=2 THEN FREENODE(CUREXP,3);T:=1;
END ELSE BEGIN IF T=2 THEN BEGIN MEM[CUREXP].HH.RH:=GIVENLIST;
GIVENLIST:=CUREXP;END;X:=CUREXP;END;END{:833}
ELSE IF MEM[Q].HH.B1<>1 THEN BEGIN T:=4;X:=0;END{:827};
IF CURCMD=35 THEN{841:}BEGIN CYCLEHIT:=TRUE;GETXNEXT;PP:=P;QQ:=P;
IF D=45 THEN IF P=Q THEN BEGIN D:=47;MEM[Q+6].INT:=65536;Y:=65536;END;
END{:841}ELSE BEGIN SCANTERTIARY;{840:}
BEGIN IF CURTYPE<>11 THEN PP:=NEWKNOT ELSE PP:=CUREXP;QQ:=PP;
WHILE MEM[QQ].HH.RH<>PP DO QQ:=MEM[QQ].HH.RH;
IF MEM[PP].HH.B0<>0 THEN BEGIN R:=COPYKNOT(PP);MEM[QQ].HH.RH:=R;QQ:=R;
END;MEM[PP].HH.B0:=4;MEM[QQ].HH.B1:=4;END{:840};END;{842:}
BEGIN IF D=45 THEN IF(MEM[Q+1].INT<>MEM[PP+1].INT)OR(MEM[Q+2].INT<>MEM[
PP+2].INT)THEN BEGIN BEGIN IF INTERACTION=3 THEN WAKEUPTERMIN;
PRINTNL(133);PRINT(675);END;BEGIN HELPPTR:=3;HELPLINE[2]:=676;
HELPLINE[1]:=677;HELPLINE[0]:=678;END;PUTGETERROR;D:=47;
MEM[Q+6].INT:=65536;Y:=65536;END;{844:}
IF MEM[PP].HH.B1=4 THEN IF T=3 THEN BEGIN MEM[PP].HH.B1:=3;
MEM[PP+5].INT:=65536;END ELSE IF T=2 THEN BEGIN MEM[PP].HH.B1:=2;
MEM[PP+5].INT:=X;END{:844};IF D=45 THEN{845:}
BEGIN IF MEM[Q].HH.B0=4 THEN IF MEM[Q].HH.B1=4 THEN BEGIN MEM[Q].HH.B0:=
3;MEM[Q+3].INT:=65536;END;
IF MEM[PP].HH.B1=4 THEN IF T=4 THEN BEGIN MEM[PP].HH.B1:=3;
MEM[PP+5].INT:=65536;END;MEM[Q].HH.B1:=MEM[PP].HH.B1;
MEM[Q].HH.RH:=MEM[PP].HH.RH;MEM[Q+5].INT:=MEM[PP+5].INT;
MEM[Q+6].INT:=MEM[PP+6].INT;FREENODE(PP,7);IF QQ=PP THEN QQ:=Q;END{:845}
ELSE BEGIN{843:}
IF MEM[Q].HH.B1=4 THEN IF MEM[Q].HH.B0=3 THEN BEGIN MEM[Q].HH.B1:=3;
MEM[Q+5].INT:=65536;
END ELSE IF MEM[Q].HH.B0=2 THEN BEGIN MEM[Q].HH.B1:=2;
MEM[Q+5].INT:=MEM[Q+3].INT;END{:843};MEM[Q].HH.RH:=PP;MEM[PP+4].INT:=Y;
IF T<>4 THEN BEGIN MEM[PP+3].INT:=X;MEM[PP].HH.B0:=T;END;END;Q:=QQ;
END{:842};
IF CURCMD>=45 THEN IF CURCMD<=47 THEN IF NOT CYCLEHIT THEN GOTO 25;
26:{846:}IF CYCLEHIT THEN BEGIN IF D=45 THEN P:=Q;
END ELSE BEGIN MEM[P].HH.B0:=0;
IF MEM[P].HH.B1=4 THEN BEGIN MEM[P].HH.B1:=3;MEM[P+5].INT:=65536;END;
MEM[Q].HH.B1:=0;IF MEM[Q].HH.B0=4 THEN BEGIN MEM[Q].HH.B0:=3;
MEM[Q+3].INT:=65536;END;MEM[Q].HH.RH:=P;END;MAKECHOICES(P,GIVENLIST);
CURTYPE:=11;CUREXP:=P{:846};END{:822}ELSE BEGIN GETXNEXT;SCANTERTIARY;
IF D<>48 THEN DOBINARY(P,C)ELSE BEGIN BACKINPUT;BINARYMAC(P,C,MACNAME);
MEM[C].HH.LH:=MEM[C].HH.LH-1;GETXNEXT;GOTO 20;END;END;GOTO 22;END;
10:END;{:821}{847:}PROCEDURE GETBOOLEAN;BEGIN GETXNEXT;SCANEXPRESSI;
IF CURTYPE<>2 THEN BEGIN DISPERR(0,679);BEGIN HELPPTR:=2;
HELPLINE[1]:=680;HELPLINE[0]:=681;END;PUTGETFLUSHE(31);CURTYPE:=2;END;
END;{:847}{1148:}PROCEDURE CLOSEFILESAN;VAR K:INTEGER;LH:INTEGER;
P:HALFWORD;X:SCALED;BEGIN IF INTERNAL[10]>0 THEN{1150:}
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE,' ');
WRITELN(LOGFILE,'Here is how much of METAFONT''s memory',' you used:');
WRITE(LOGFILE,' ',MAXSTRPTR-INITSTRPTR:1,' string');
IF MAXSTRPTR<>INITSTRPTR+1 THEN WRITE(LOGFILE,'s');
WRITELN(LOGFILE,' out of ',MAXSTRINGS-INITSTRPTR:1);
WRITELN(LOGFILE,' ',MAXPOOLPTR-INITPOOLPTR:1,
' string characters out of ',POOLSIZE-INITPOOLPTR:1);
WRITELN(LOGFILE,' ',MAXVARUSED:1,'&',MEMEND-25999:1,
' words of memory out of ',26000:1,'&',MEMMAX-25999:1);
WRITELN(LOGFILE,' ',STCOUNT:1,' symbolic tokens out of ',2100:1);
WRITELN(LOGFILE,' ',MAXINSTACK:1,'i,',INTPTR:1,'n,',MAXPARAMSTAC:1,'p,',
MAXBUFSTACK+1:1,'b stack positions out of ',STACKSIZE:1,'i,',MAXINTERNAL
:1,'n,',150:1,'p,',BUFSIZE:1,'b');END{:1150};WAKEUPTERMIN;{1149:}
IF(GFPREVPTR>0)OR(INTERNAL[27]>0)THEN BEGIN{171:}ROVER:=27;
MEM[ROVER].HH.RH:=262143;MEM[ROVER].HH.LH:=26000-ROVER;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;MEM[26000].HH.RH:=0;
MEM[26000].HH.LH:=0;{:171};{1072:}MEM[26001].HH.RH:=23;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN TFMWIDTH[K]:=SORTIN(TFMWIDTH[K])
;NW:=SKIMP(255)+1;DIMENHEAD[1]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(18){:1072};FIXCHECKSUM;
FIXDESIGNSIZ;IF INTERNAL[27]>0 THEN BEGIN{1074:}MEM[26001].HH.RH:=23;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMHEIGHT[K]=0 THEN TFMHEIGHT
[K]:=17 ELSE TFMHEIGHT[K]:=SORTIN(TFMHEIGHT[K]);NH:=SKIMP(15)+1;
DIMENHEAD[2]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(19);MEM[26001].HH.RH:=23;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMDEPTH[K]=0 THEN TFMDEPTH[K
]:=17 ELSE TFMDEPTH[K]:=SORTIN(TFMDEPTH[K]);ND:=SKIMP(15)+1;
DIMENHEAD[3]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(20);MEM[26001].HH.RH:=23;
FOR K:=BC TO EC DO IF CHAREXISTS[K]THEN IF TFMITALCORR[K]=0 THEN
TFMITALCORR[K]:=17 ELSE TFMITALCORR[K]:=SORTIN(TFMITALCORR[K]);
NI:=SKIMP(15)+1;DIMENHEAD[4]:=MEM[26001].HH.RH;
IF PERTURBATION>=4096 THEN TFMWARNING(21){:1074};{1080:}
IF JOBNAME=0 THEN OPENLOGFILE;PACKJOBNAME(588);
WHILE NOT TFMBOPENOUT(TFMFILE)DO PROMPTFILENA(884,588);
METRICFILENA:=BMAKENAMESTR(TFMFILE);{1081:}K:=HEADERSIZE;
WHILE HEADERBYTE[K]<0 DO K:=K-1;LH:=(K+3)DIV 4;IF BC>EC THEN BC:=1;
TFMTWO(6+LH+(EC-BC+1)+NW+NH+ND+NI+NL+NK+NE+NP);TFMTWO(LH);TFMTWO(BC);
TFMTWO(EC);TFMTWO(NW);TFMTWO(NH);TFMTWO(ND);TFMTWO(NI);TFMTWO(NL);
TFMTWO(NK);TFMTWO(NE);TFMTWO(NP);
FOR K:=1 TO 4*LH DO BEGIN IF HEADERBYTE[K]<0 THEN HEADERBYTE[K]:=0;
WRITE(TFMFILE,HEADERBYTE[K]);END{:1081};{1082:}
FOR K:=BC TO EC DO IF NOT CHAREXISTS[K]THEN TFMFOUR(0)ELSE BEGIN WRITE(
TFMFILE,MEM[TFMWIDTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMHEIGHT[K]].HH.LH)*16+MEM[TFMDEPTH[K]].HH.LH);
WRITE(TFMFILE,(MEM[TFMITALCORR[K]].HH.LH)*4+CHARTAG[K]);
WRITE(TFMFILE,CHARREMAINDE[K]);END{:1082};{1085:}TFMCHANGED:=0;
FOR K:=1 TO 4 DO BEGIN TFMFOUR(0);P:=DIMENHEAD[K];
WHILE P<>23 DO BEGIN TFMDIMENOUT(MEM[P+1].INT);P:=MEM[P].HH.RH;END;
END{:1085};{1086:}FOR K:=0 TO NL-1 DO TFMQQQQ(LIGKERN[K]);
FOR K:=0 TO NK-1 DO TFMDIMENOUT(KERN[K]){:1086};{1087:}
FOR K:=0 TO NE-1 DO TFMQQQQ(EXTEN[K]){:1087};{1088:}
FOR K:=1 TO NP DO IF K=1 THEN IF ABS(PARAM[1])<134217728 THEN TFMFOUR(
PARAM[1]*16)ELSE BEGIN TFMCHANGED:=TFMCHANGED+1;
IF PARAM[1]>0 THEN TFMFOUR(2147483647)ELSE TFMFOUR(-2147483647);
END ELSE TFMDIMENOUT(PARAM[K]);
IF TFMCHANGED>0 THEN BEGIN IF TFMCHANGED=1 THEN PRINTNL(886)ELSE BEGIN
PRINTNL(40);PRINTINT(TFMCHANGED);PRINT(887);END;PRINT(888);END{:1088};
PRINTNL(885);PRINT(METRICFILENA);BCLOSE(TFMFILE){:1080};END;
IF GFPREVPTR>0 THEN{1125:}BEGIN BEGIN GFBUF[GFPTR]:=248;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFPREVPTR);
GFPREVPTR:=GFOFFSET+GFPTR-5;GFFOUR(INTERNAL[23]*16);
FOR K:=1 TO 4 DO BEGIN GFBUF[GFPTR]:=HEADERBYTE[K];GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(INTERNAL[24]);
GFFOUR(INTERNAL[25]);GFFOUR(GFMINX);GFFOUR(GFMAXX-1);GFFOUR(GFMINY);
GFFOUR(GFMAXY);
FOR K:=0 TO 255 DO IF CHAREXISTS[K]THEN BEGIN BEGIN GFBUF[GFPTR]:=246;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;BEGIN GFBUF[GFPTR]:=K;
GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;GFFOUR(GFWIDTH[K]);
X:=MEM[TFMWIDTH[K]+1].INT;
IF ABS(X)>MAXTFMDIMEN THEN IF X>0 THEN X:=16777215 ELSE X:=-16777215
ELSE X:=MAKESCALED(X*16,INTERNAL[23]);GFFOUR(X);GFFOUR(CHARPTR[K]);END;
BEGIN GFBUF[GFPTR]:=249;GFPTR:=GFPTR+1;IF GFPTR=GFLIMIT THEN GFSWAP;END;
GFFOUR(GFPREVPTR);BEGIN GFBUF[GFPTR]:=129;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=4+((GFBUFSIZE-GFPTR)MOD 4);
WHILE K>0 DO BEGIN BEGIN GFBUF[GFPTR]:=223;GFPTR:=GFPTR+1;
IF GFPTR=GFLIMIT THEN GFSWAP;END;K:=K-1;END;{1103:}
IF GFLIMIT=HALFBUF THEN WRITEGF(HALFBUF,GFBUFSIZE-1);
IF GFPTR>0 THEN WRITEGF(0,GFPTR-1){:1103};PRINTNL(897);
PRINT(OUTPUTFILENA);PRINT(427);PRINTINT(TOTALCHARS);PRINT(898);
IF TOTALCHARS<>1 THEN PRINTCHAR(115);PRINT(899);
PRINTINT(GFOFFSET+GFPTR);PRINT(900);BCLOSE(GFFILE);
IF PSEUDOTYPEIN=0 THEN IF INTERNAL[28]>0 THEN BEGIN K:=SELECTOR;
SELECTOR:=5;POOLPTR:=STRSTART[STRPTR];PRINT(901);PRINT(OUTPUTFILENA);
SELECTOR:=K;
IF POOLPTR<POOLSIZE THEN IF STRPTR<MAXSTRINGS THEN PSEUDOTYPEIN:=
MAKESTRING;END;END{:1125};END{:1149};
IF JOBNAME>0 THEN BEGIN WRITELN(LOGFILE);ACLOSE(LOGFILE);
SELECTOR:=SELECTOR-2;IF SELECTOR=1 THEN BEGIN PRINTNL(910);
PRINT(LOGNAME);PRINTCHAR(46);END;END;
IF(PSEUDOTYPEIN<>0)AND(INTERACTION>0)THEN BEGIN WRITELN(TTY);
FOR K:=STRSTART[PSEUDOTYPEIN]TO STRSTART[PSEUDOTYPEIN+1]-1 DO PTWR1W(0,
ORD(XCHR[STRPOOL[K]]));END;END;{:1148}{1151:}PROCEDURE FINALCLEANUP;
LABEL 10;VAR C:SMALLNUMBER;BEGIN C:=CURMOD;
IF JOBNAME=0 THEN OPENLOGFILE;WHILE CONDPTR<>0 DO BEGIN PRINTNL(911);
PRINTCMDMOD(2,CURIF);IF IFLINE<>0 THEN BEGIN PRINT(912);
PRINTINT(IFLINE);END;PRINT(913);IFLINE:=MEM[CONDPTR+1].INT;
CURIF:=MEM[CONDPTR].HH.B1;CONDPTR:=MEM[CONDPTR].HH.RH;END;
IF HISTORY<>0 THEN IF((HISTORY=1)OR(INTERACTION<3))THEN IF SELECTOR=3
THEN BEGIN SELECTOR:=1;PRINTNL(914);SELECTOR:=3;END;
IF C=1 THEN BEGIN STOREBASEFIL;GOTO 10;PRINTNL(915);GOTO 10;END;10:END;
{:1151}{1152:}PROCEDURE INITPRIM;BEGIN{186:}PRIMITIVE(281,38,1);
PRIMITIVE(282,38,2);PRIMITIVE(283,38,3);PRIMITIVE(284,38,4);
PRIMITIVE(285,38,5);PRIMITIVE(286,38,6);PRIMITIVE(287,38,7);
PRIMITIVE(288,38,8);PRIMITIVE(289,38,9);PRIMITIVE(290,38,10);
PRIMITIVE(291,38,11);PRIMITIVE(292,38,12);PRIMITIVE(293,38,13);
PRIMITIVE(294,38,14);PRIMITIVE(295,38,15);PRIMITIVE(296,38,16);
PRIMITIVE(297,38,17);PRIMITIVE(298,38,18);PRIMITIVE(299,38,19);
PRIMITIVE(300,38,20);PRIMITIVE(301,38,21);PRIMITIVE(302,38,22);
PRIMITIVE(303,38,23);PRIMITIVE(304,38,24);PRIMITIVE(305,38,25);
PRIMITIVE(306,38,26);PRIMITIVE(307,38,27);PRIMITIVE(308,38,28);
PRIMITIVE(309,38,29);PRIMITIVE(310,38,30);PRIMITIVE(311,38,31);{:186}
{205:}PRIMITIVE(280,47,0);PRIMITIVE(91,52,0);EQTB[2232]:=EQTB[CURSYM];
PRIMITIVE(93,63,0);PRIMITIVE(125,64,0);PRIMITIVE(123,46,0);
PRIMITIVE(58,77,0);EQTB[2234]:=EQTB[CURSYM];PRIMITIVE(323,76,0);
PRIMITIVE(44,78,0);PRIMITIVE(59,79,0);EQTB[2235]:=EQTB[CURSYM];
PRIMITIVE(92,7,0);EQTB[2239]:=EQTB[CURSYM];PRIMITIVE(324,17,0);
PRIMITIVE(325,70,0);PRIMITIVE(316,31,0);EQTB[2240]:=EQTB[CURSYM];
PRIMITIVE(326,72,0);PRIMITIVE(327,58,0);PRIMITIVE(328,18,0);
PRIMITIVE(329,60,0);PRIMITIVE(330,26,0);PRIMITIVE(331,9,0);
PRIMITIVE(317,80,0);EQTB[2241]:=EQTB[CURSYM];PRIMITIVE(332,25,0);
PRIMITIVE(333,6,0);PRIMITIVE(334,68,0);PRIMITIVE(335,71,0);
PRIMITIVE(336,11,0);PRIMITIVE(337,12,0);PRIMITIVE(338,13,0);
PRIMITIVE(339,67,0);PRIMITIVE(340,27,0);PRIMITIVE(341,23,0);
PRIMITIVE(342,15,0);PRIMITIVE(343,10,0);PRIMITIVE(344,16,0);
PRIMITIVE(345,73,0);PRIMITIVE(346,34,0);PRIMITIVE(347,69,0);
PRIMITIVE(348,74,0);{:205}{638:}PRIMITIVE(493,14,1);PRIMITIVE(494,14,2);
PRIMITIVE(495,14,53);PRIMITIVE(496,14,43);PRIMITIVE(497,14,48);
PRIMITIVE(318,14,0);EQTB[2237]:=EQTB[CURSYM];PRIMITIVE(498,4,2394);
PRIMITIVE(499,4,2544);PRIMITIVE(500,4,1);PRIMITIVE(319,4,0);
EQTB[2236]:=EQTB[CURSYM];{:638}{645:}PRIMITIVE(505,61,0);
PRIMITIVE(506,61,1);PRIMITIVE(64,61,2);PRIMITIVE(507,61,3);{:645}{652:}
PRIMITIVE(518,57,2394);PRIMITIVE(519,57,2544);PRIMITIVE(520,57,2694);
PRIMITIVE(521,57,1);PRIMITIVE(522,57,2);PRIMITIVE(523,57,3);{:652}{667:}
PRIMITIVE(534,3,0);PRIMITIVE(458,3,1);{:667}{694:}PRIMITIVE(563,1,1);
PRIMITIVE(315,2,2);EQTB[2238]:=EQTB[CURSYM];PRIMITIVE(564,2,3);
PRIMITIVE(565,2,4);{:694}{835:}PRIMITIVE(671,59,1);PRIMITIVE(672,59,0);
{:835}{848:}PRIMITIVE(221,32,30);PRIMITIVE(222,32,31);
PRIMITIVE(223,32,32);PRIMITIVE(224,32,33);PRIMITIVE(225,32,34);
PRIMITIVE(226,32,35);PRIMITIVE(227,32,36);PRIMITIVE(228,32,37);
PRIMITIVE(229,33,38);PRIMITIVE(230,33,39);PRIMITIVE(231,33,40);
PRIMITIVE(232,33,41);PRIMITIVE(233,33,42);PRIMITIVE(234,33,43);
PRIMITIVE(235,33,44);PRIMITIVE(236,33,45);PRIMITIVE(237,33,46);
PRIMITIVE(238,33,47);PRIMITIVE(239,33,48);PRIMITIVE(240,33,49);
PRIMITIVE(241,33,50);PRIMITIVE(242,33,51);PRIMITIVE(243,33,52);
PRIMITIVE(244,33,53);PRIMITIVE(245,33,54);PRIMITIVE(246,33,55);
PRIMITIVE(247,33,56);PRIMITIVE(248,33,57);PRIMITIVE(249,33,58);
PRIMITIVE(250,33,59);PRIMITIVE(251,33,60);PRIMITIVE(252,33,61);
PRIMITIVE(253,33,62);PRIMITIVE(254,33,63);PRIMITIVE(255,33,64);
PRIMITIVE(256,33,65);PRIMITIVE(257,35,66);PRIMITIVE(43,42,67);
PRIMITIVE(45,42,68);PRIMITIVE(42,55,69);PRIMITIVE(47,54,70);
EQTB[2233]:=EQTB[CURSYM];PRIMITIVE(258,44,71);PRIMITIVE(260,51,73);
PRIMITIVE(259,44,72);PRIMITIVE(60,49,74);PRIMITIVE(261,49,75);
PRIMITIVE(62,49,76);PRIMITIVE(262,49,77);PRIMITIVE(61,50,78);
PRIMITIVE(263,49,79);PRIMITIVE(264,36,91);PRIMITIVE(265,36,92);
PRIMITIVE(266,36,93);PRIMITIVE(267,36,94);PRIMITIVE(268,36,95);
PRIMITIVE(269,36,96);PRIMITIVE(270,36,97);PRIMITIVE(38,45,80);
PRIMITIVE(271,55,81);PRIMITIVE(272,55,82);PRIMITIVE(273,55,83);
PRIMITIVE(274,55,84);PRIMITIVE(275,55,85);PRIMITIVE(276,55,86);
PRIMITIVE(277,55,87);PRIMITIVE(278,55,88);PRIMITIVE(279,44,89);{:848}
{965:}PRIMITIVE(214,29,18);PRIMITIVE(200,29,4);PRIMITIVE(198,29,2);
PRIMITIVE(207,29,11);PRIMITIVE(202,29,6);PRIMITIVE(205,29,9);
PRIMITIVE(209,29,13);PRIMITIVE(210,29,14);{:965}{970:}
PRIMITIVE(756,81,0);PRIMITIVE(757,81,1);{:970}{975:}PRIMITIVE(145,22,0);
PRIMITIVE(146,22,1);PRIMITIVE(147,22,2);PRIMITIVE(762,22,3);{:975}{978:}
PRIMITIVE(763,20,0);PRIMITIVE(764,20,1);{:978}{988:}PRIMITIVE(777,21,0);
PRIMITIVE(778,21,1);PRIMITIVE(779,21,2);PRIMITIVE(780,21,3);
PRIMITIVE(781,21,4);PRIMITIVE(782,21,5);PRIMITIVE(783,21,6);{:988}
{1002:}PRIMITIVE(802,66,0);PRIMITIVE(803,66,1);PRIMITIVE(804,66,2);
PRIMITIVE(805,65,6);PRIMITIVE(806,65,15);{:1002}{1027:}
PRIMITIVE(835,24,0);PRIMITIVE(836,24,1);PRIMITIVE(837,24,2);{:1027}
{1049:}PRIMITIVE(848,19,0);PRIMITIVE(849,19,1);PRIMITIVE(850,19,2);
PRIMITIVE(851,19,3);PRIMITIVE(852,19,4);{:1049}{1057:}
PRIMITIVE(872,75,0);PRIMITIVE(873,75,128);{:1057}{1117:}
PRIMITIVE(892,28,4);PRIMITIVE(893,28,15);{:1117}{1169:}HASH[13].RH:=12;
EQTB[13].LH:=161;{:1169};END;PROCEDURE INITTAB;VAR K:INTEGER;BEGIN{170:}
{171:}ROVER:=27;MEM[ROVER].HH.RH:=262143;MEM[ROVER].HH.LH:=26000-ROVER;
MEM[ROVER+1].HH.LH:=ROVER;MEM[ROVER+1].HH.RH:=ROVER;MEM[26000].HH.RH:=0;
MEM[26000].HH.LH:=0;{:171};FOR K:=26001 TO 26003 DO MEM[K]:=MEM[26000];
AVAIL:=0;MEMEND:=26003;VARUSED:=27;DYNUSED:=4;MAXVARUSED:=VARUSED;{:170}
{187:}INTNAME[1]:=281;INTNAME[2]:=282;INTNAME[3]:=283;INTNAME[4]:=284;
INTNAME[5]:=285;INTNAME[6]:=286;INTNAME[7]:=287;INTNAME[8]:=288;
INTNAME[9]:=289;INTNAME[10]:=290;INTNAME[11]:=291;INTNAME[12]:=292;
INTNAME[13]:=293;INTNAME[14]:=294;INTNAME[15]:=295;INTNAME[16]:=296;
INTNAME[17]:=297;INTNAME[18]:=298;INTNAME[19]:=299;INTNAME[20]:=300;
INTNAME[21]:=301;INTNAME[22]:=302;INTNAME[23]:=303;INTNAME[24]:=304;
INTNAME[25]:=305;INTNAME[26]:=306;INTNAME[27]:=307;INTNAME[28]:=308;
INTNAME[29]:=309;INTNAME[30]:=310;INTNAME[31]:=311;{:187}{197:}
HASHUSED:=2229;STCOUNT:=0;HASH[2242].RH:=314;HASH[2239].RH:=92;
HASH[2238].RH:=315;HASH[2240].RH:=316;HASH[2241].RH:=317;
HASH[2237].RH:=318;HASH[2236].RH:=319;HASH[2235].RH:=59;
HASH[2234].RH:=58;HASH[2233].RH:=47;HASH[2232].RH:=91;HASH[2231].RH:=41;
HASH[2229].RH:=320;EQTB[2231].LH:=62;MEM[26003].HH.LH:=2239;{:197}{221:}
MEM[23].HH.LH:=2244;MEM[23].HH.RH:=0;{:221}{316:}
MEM[26000].HH.LH:=262143;{:316}{435:}MEM[3].HH.LH:=0;MEM[3].HH.RH:=0;
MEM[4].HH.LH:=1;MEM[4].HH.RH:=0;FOR K:=5 TO 11 DO MEM[K]:=MEM[4];
MEM[12].INT:=0;MEM[0].HH.RH:=0;MEM[0].HH.LH:=0;MEM[1].INT:=0;
MEM[2].INT:=0;{:435}{545:}MEM[13].HH.RH:=13;MEM[14].HH.LH:=13;
MEM[13].HH.LH:=0;MEM[14].HH.RH:=0;{:545}{658:}MEM[25].HH.B1:=0;
MEM[25].HH.RH:=2242;EQTB[2242].RH:=25;EQTB[2242].LH:=CURINPUT.NAMEFIELD;
{:658}{712:}EQTB[2230].LH:=87;HASH[2230].RH:=580;{:712}{801:}
MEM[26002].HH.LH:=2394;{:801}{866:}MEM[19].HH.B1:=11;{:866}{1064:}
MEM[24].INT:=1073741824;{:1064}{1075:}MEM[18].INT:=0;MEM[17].HH.LH:=0;
{:1075}{1128:}BASEIDENT:=902;{:1128}END;{:1152}{1154:}
PROCEDURE DEBUGHELP;LABEL 888,10;VAR K,L,M,N:INTEGER;
BEGIN WHILE TRUE DO BEGIN WAKEUPTERMIN;PRINTNL(916);BREAK(TTY);
READ(TTY,M);IF M<0 THEN GOTO 10 ELSE IF M=0 THEN BEGIN GOTO 888;
888:M:=0;{'BREAKPOINT'}
END ELSE BEGIN READ(TTY,N);CASE M OF{1155:}1:PRINTWORD(MEM[N]);
2:PRINTINT(MEM[N].HH.LH);3:PRINTINT(MEM[N].HH.RH);
4:BEGIN PRINTINT(EQTB[N].LH);PRINTCHAR(58);PRINTINT(EQTB[N].RH);END;
5:PRINTVARIABL(N);6:PRINTINT(INTERNAL[N]);7:DOSHOWDEPEND(6);
9:SHOWTOKENLIS(N,0,1000);10:PRINT(N);11:CHECKMEM(N>0);12:SEARCHMEM(N);
13:BEGIN READ(TTY,L);PRINTCMDMOD(N,L);END;
14:FOR K:=0 TO N DO PRINT(BUFFER[K]);15:PANICKING:=NOT PANICKING;{:1155}
OTHERS:PRINT(63)END;END;END;10:END;{:1154}{1159:}
{FUNCTION TEXPHN:BOOLEAN;EXTERN;PROCEDURE TEXCHK;EXTERN;}{:1159}{1163:}
{PROCEDURE MAGIC;LABEL 10;TYPE BITS=0..35;VAR NUMCOUNTS:INTEGER;
JOBHRL:INTEGER;JUNK,I,J:INTEGER;SUCCESS:BOOLEAN;
HACK,MEMRY:PACKED RECORD CASE INTEGER OF 0:(XX:HALFWORD;P:↑INTEGER);
1:(Z:INTEGER);2:(LH:HALFWORD;RH:HALFWORD);
3:(SIXBIT:PACKED ARRAY[1..6]OF 0..63);4:(B:SET OF BITS)END;
BEGIN IF NOT TEXPHN THEN GOTO 10;[1164:]HACK.Z:=77;HACK.Z:=HACK.P↑;
JOBHRL:=HACK.RH[:1164];[1165:]NUMCOUNTS:=0;MEMRY.Z:=131073;
WHILE MEMRY.Z<JOBHRL DO BEGIN HACK.Z:=MEMRY.P↑;
IF(HACK.LH=120832)AND(HACK.RH=MEMRY.Z+1)THEN BEGIN MEMRY.Z:=MEMRY.Z+1;
MEM[NUMCOUNTS].INT:=MEMRY.Z;NUMCOUNTS:=NUMCOUNTS+1;END;
MEMRY.Z:=MEMRY.Z+1;END[:1165];[1166:]RESET(COUNTFILE,COUNTNAME,'/O');
IF NOT EOF(COUNTFILE)THEN BEGIN READLN(COUNTFILE,I);
IF I=NUMCOUNTS THEN FOR I:=0 TO NUMCOUNTS-1 DO BEGIN MEMRY.Z:=MEM[I].INT
;READLN(COUNTFILE,MEMRY.P↑);END;END;CLOSE(COUNTFILE)[:1166];
[1167:]WHILE TRUE DO BEGIN FOR I:=1 TO WRITEPERIOD DO BEGIN FOR J:=1 TO
CHECKPERIOD DO CALLI(25,,60,JUNK,SUCCESS);TEXCHK;END;
REWRITE(COUNTFILE,COUNTNAME);WRITELN(COUNTFILE,NUMCOUNTS);
FOR I:=0 TO NUMCOUNTS-1 DO BEGIN MEMRY.Z:=MEM[I].INT;
WRITELN(COUNTFILE,MEMRY.P↑:1);END;CLOSE(COUNTFILE);END[:1167];10:END;}
{:1163}{:1145}{1147:}BEGIN HISTORY:=3;;
IF READYALREADY=314159 THEN GOTO 1;{14:}BAD:=0;
IF(HALFERRORLIN<30)OR(HALFERRORLIN>ERRORLINE-15)THEN BAD:=1;
IF MAXPRINTLINE<60 THEN BAD:=2;IF GFBUFSIZE MOD 8<>0 THEN BAD:=3;
IF(26000<100)OR(26100>MEMMAX)THEN BAD:=4;IF 1777>2100 THEN BAD:=5;
IF HEADERSIZE MOD 4<>0 THEN BAD:=6;{:14}{148:}
IF(0>0)OR(511<127)THEN BAD:=11;IF(0>0)OR(262143<32767)THEN BAD:=12;
IF(0<0)OR(511>262143)THEN BAD:=13;IF(0<0)OR(MEMMAX>=262143)THEN BAD:=14;
IF MAXSTRINGS>262143 THEN BAD:=15;IF BUFSIZE>262143 THEN BAD:=16;
IF(511<255)OR(262143<65535)THEN BAD:=17;{:148}{198:}
IF 2243+MAXINTERNAL>262143 THEN BAD:=21;{:198}{208:}
IF 2844>262143 THEN BAD:=22;{:208}{302:}
IF 15*11>BISTACKSIZE THEN BAD:=31;{:302}{512:}
IF 20+17*44>BISTACKSIZE THEN BAD:=32;{:512}{730:}
IF 18>FILENAMESIZE THEN BAD:=41;{:730}IF BAD>0 THEN BEGIN;
WRITE(TTY,'Ouch---my internal constants have been',' clobbered!---case '
,BAD:1);GOTO 9999;END;INITIALIZE;IF NOT GETSTRINGSST THEN GOTO 9999;
INITTAB;INITPRIM;READYALREADY:=314159;1:{55:}SELECTOR:=1;TALLY:=0;
TERMOFFSET:=0;FILEOFFSET:=0;{:55}{60:}
WRITE(TTY,'This is METAFONT, WAITS Version 0.3');
IF BASEIDENT=0 THEN WRITELN(TTY,' (no base preloaded)')ELSE BEGIN PRINT(
BASEIDENT);PRINTLN;END;{:60}{736:}JOBNAME:=0;{:736}{744:}
OUTPUTFILENA:=0;{:744}{1162:}{MAGIC;}{:1162};{1153:}BEGIN{613:}
BEGIN INPUTPTR:=0;MAXINSTACK:=0;INOPEN:=0;MAXBUFSTACK:=0;PARAMPTR:=0;
MAXPARAMSTAC:=0;FIRST:=1;CURINPUT.STARTFIELD:=1;CURINPUT.INDEXFIELD:=0;
LINE:=0;CURINPUT.NAMEFIELD:=0;FORCEEOF:=FALSE;
IF NOT INITTERMINAL THEN GOTO 9999;CURINPUT.LIMITFIELD:=LAST;
FIRST:=LAST+1;END;{:613}{616:}SCANNERSTATU:=0;{:616};
IF(BASEIDENT=0)OR(BUFFER[CURINPUT.LOCFIELD]=38)THEN BEGIN IF BASEIDENT<>
0 THEN INITIALIZE;IF NOT OPENBASEFILE THEN GOTO 9999;
IF NOT LOADBASEFILE THEN BEGIN WCLOSE(BASEFILE);GOTO 9999;END;
WCLOSE(BASEFILE);
WHILE(CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD)AND(BUFFER[CURINPUT.LOCFIELD
]=32)DO CURINPUT.LOCFIELD:=CURINPUT.LOCFIELD+1;END;
BUFFER[CURINPUT.LIMITFIELD]:=37;FIXDATEANDTI;
INITRANDOMS((INTERNAL[15]DIV 65536)+INTERNAL[14]);{69:}
IF INTERACTION=0 THEN SELECTOR:=0 ELSE SELECTOR:=1{:69};
IF CURINPUT.LOCFIELD<CURINPUT.LIMITFIELD THEN IF BUFFER[CURINPUT.
LOCFIELD]<>92 THEN STARTINPUT;END{:1153};INITSTRPTR:=STRPTR;
INITPOOLPTR:=POOLPTR;MAXSTRPTR:=STRPTR;MAXPOOLPTR:=POOLPTR;HISTORY:=0;
IF STARTSYM>0 THEN BEGIN CURSYM:=STARTSYM;BACKINPUT;END;MAINCONTROL;
FINALCLEANUP;9998:CLOSEFILESAN;9999:READYALREADY:=0;END.{:1147}